[英]Item allocation in a knapsack with Choco Solver
我嘗試通過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]
先感謝您。
這是一個常見的錯誤,您只是忘了發布約束,因此不考慮它們。 例如,您應該更換
model.element(itemWeightVar[i], itemWeight,x[i]);
通過
model.element(itemWeightVar[i], itemWeight,x[i]).post();
請注意,發布不是自動的,因為您可能想驗證約束而不是發布約束(例如發生在ifThen語句中)。
最好,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.