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

时间:2016-06-19 09:11:33

标签: java choco

我尝试通过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]

提前谢谢。

1 个答案:

答案 0 :(得分:0)

这是一个常见的错误,您只是忘记POST约束,因此不会考虑它们。例如,您应该替换

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

通过

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

请注意,帖子不是自动的,因为您可能希望更新约束而不是发布约束(例如,在ifThen语句中发生)。

最佳,

https://www.cosling.com/