0

JAVA を介して Choco Solver で多次元ナップザック問題を実装しようとしています。私のアイデアは、2 つのナップザックに 3 つのアイテムを割り当てることです。

私のアイテムには重量があり、ナップザックには制限があります: int[] itemWeight = {2, 2, 2}; int[] knapsackLimit = {4, 4};

そして、3 つのアイテムが {0, 1} の間にナップザックを持つ私の決定変数: int[] itemAllocation = {1, 1, 0};

Choco Solver を使用してこの問題を書きました。

Model model = new Model("KnapsackProblem");

// Allocation variable
IntVar[] x = new IntVar[3];
for (int i = 0; i < itemNumber; i++) {
    x[i] = model.intVar("x"+i, 0, knapsackNumber-1);
}

// Knapsack capacities variables
IntVar[] limitVar = new IntVar[knapsackNumber];
for (int i = 0; i < knapsackNumber; i++) {
    limit[i] = model.intVar(knapsackLimit[i]);
}

IntVar[] itemWeightVar = new IntVar[itemNumber];
for (int i = 0; i < itemNumber; i++) {
    itemWeightVar[i] = model.intVar(0, 2);
    model.element(itemWeightVar[i], itemWeight,x[i]);
}

// Limit Cosntraints
for (int i = 0; i < knapsackNumber; i++) {
    model.sum(itemWeightVar, "<=", limit[x[i].getValue()]);
}

model.getSolver().solve();

残念ながら、この方法はうまくいきません。私は常に次の割り当てを取得します: [x0 = 0, x1 = 0, x2 = 0]

前もって感謝します。

4

1 に答える 1

0

これはよくある間違いです。単に制約を POST するのを忘れているため、制約が考慮されません。たとえば、次のように置き換えます。

model.element(itemWeightVar[i], itemWeight,x[i]);

model.element(itemWeightVar[i], itemWeight,x[i]).post();

ポストする代わりに制約を具体化する必要がある場合があるため、ポストは自動ではないことに注意してください (たとえば、ifThen ステートメント内で発生します)。

一番、

https://www.cosling.com/

于 2016-06-22T23:16:40.040 に答える