2016-06-19 8 views
0

私はChoco SolverでJAVAを使って多次元ナップザック問題を実装しようとしています。私の考えは、2つのナップザックに3つのアイテムを割り当てることです。チョコソルバーを使ったナップザックでのアイテム割り当て

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

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

私はチョコソルバーを使用することによって、この問題を書いた:

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]

ありがとう。

答えて

0

これはよくある間違いです。制約を考慮しないようにPOSTを忘れてしまいます。たとえば、あなたが(例えばifThenステートメント内で起こる)の制約はなく、それを掲示を具体化することもできますとしてポストは自動ではないことを

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

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

で置き換えてください。

https://www.cosling.com/

+0

ベスト

は、あなたの答えをいただき、ありがとうございます。それはチョコソルバーの新しい名前です? – AkrogAmes

+0

ようこそ。いいえコスリング私の会社の名前ですが、私たちはチョコソルバーにあなたの興味をそそるかもしれないprofessionnalサポートを提供する –

関連する問題