簡體   English   中英

使用Choco Solver在背包中分配物品

[英]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語句中)。

最好,

https://www.cosling.com/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM