繁体   English   中英

安全包装 - Choco-solver

[英]Safe packing - Choco-solver

问题:

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

在此处输入图像描述

这种包装不安全。 面包被压扁是因为它上面的重量 5 大于它的强度 4。然而,交换苹果和面包可以得到一个安全的包装。

目标:

我需要使用 choco solver 找到这个问题的所有解决方案,然后测试是否枚举了这个解决方案:

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

我尝试了什么:

首先我写了我的 CSP model

在此处输入图像描述

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

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

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

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

为了使您的 model 工作,您需要将sum建立为IntVar

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM