问题:
你需要把几件东西装进你的购物袋里,不要压扁任何东西。这些物品要放在另一件上面。每个项目都有一个重量和一个强度,定义为可以放置在该项目之上的最大重量而不被压扁。包装订单是安全的,如果没有在袋子中的物品被压扁,也就是说,对于每一个项目,该项目的强度至少是放置在该项目之上的重量的总和。例如,这里有三个项目和一个包装订单:

这种包装不安全。面包被压碎了,因为上面5的重量大于它的强度,4.交换苹果和面包,就可以安全地包装起来。
目标:
我需要找到解决这个问题的所有解决方案,然后测试这个解决方案是否被列举:
N=3, WS = { (5,6), (4,4), (10,10) } 我尝试了什么:
首先我写了我的CSP模型

然后我把巧克力代码写成这样
public static void main(String[] args) {
int[][] InitialList = {{5,6}, {4,4}, {10,10}};
int N = InitialList.length;
Model model = new Model("SafePacking");
// Create IntVars of weights and strengths
IntVar[] weights = new IntVar[N], strengths = new IntVar[N];
for (int i = 0; i < N; i++) {
weights[i] = model.intVar("Weight"+i, InitialList[i][0]);
strengths[i] = model.intVar("Strength"+i, InitialList[i][1]);
}
// Create IntVar of positions
IntVar[] positions = model.intVarArray("P",N, 0, N-1);
model.allDifferent(positions).post();
for(int i = 0; i < N; i++) {
int sum = 0;
for(int j = 0; j < N; j++)
if (positions[j].getValue() < positions[i].getValue())
sum += weights[j].getValue();
model.arithm(model.intVar(sum), "<=", strengths[i]).post();
}
Solution solution = model.getSolver().findSolution();
System.out.println(solution);
}但我得到了这个结果:
Solution: P[0]=0, P[1]=1, P[2]=2这是个错误的解决方案。我错过了什么吗?
发布于 2020-07-06 08:32:14
和的计算似乎假定变量有一个定义的值,但它们没有。在未实例化的getValue()上调用IntVar将为Choco中的变量提供下限。
要使模型正常工作,您需要将sum构建为一个IntVar。
https://stackoverflow.com/questions/62746763
复制相似问题