【问题标题】:Item allocation in a knapsack with Choco Solver使用 Choco Solver 在背包中分配物品
【发布时间】:2016-06-23 07:16:40
【问题描述】:

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

提前谢谢你。

【问题讨论】:

    标签: java choco


    【解决方案1】:

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

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

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

    请注意,该帖子不是自动发布的,因为您可能想要具体化约束而不是发布它(例如在 ifThen 语句中发生)。

    最好的,

    https://www.cosling.com/

    【讨论】:

    • 感谢您的回答。 Cosling 是 Choco Solver 的新名称?
    • 不客气。 Cosling 不是我公司的名称,但我们为您可能感兴趣的 Choco Solver 提供专业支持
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多