安全包装-巧克力溶解器

时间:2020-07-05 21:58:09

标签: java constraints constraint-programming

问题:

您需要在不挤压任何东西的情况下将几个物品装进购物袋。这些项目应一个放在另一个之上。每个项目都有重量和强度,定义为在不挤压的情况下可以放置在该项目上方的最大重量。如果没有压扁袋子中的任何物品,也就是说,如果对于每件物品而言,该物品的强度至少是放在该物品上方的物品的总重量,则打包命令是安全的。例如,这是三个项目和一个包装订单:

enter image description here

此包装不安全。压扁面包是因为其上方的重量5比其强度4大。但是,将苹果和面包交换后,可以安全包装。

目标:

我需要使用choco求解器找到该问题的所有解决方案,然后测试此解决方案是否已枚举:

N=3, WS = { (5,6), (4,4), (10,10) } 

我尝试过的事情:

首先,我编写了CSP模型

enter image description here

然后我这样写我的巧克力代码

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

这是错误的解决方案。 我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

求和的计算似乎假设变量具有定义的值,而没有。在未实例化的getValue()上调用IntVar将为Choco中的变量赋予下限。

要使模型正常工作,您需要将sum建立为IntVar