首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安全包装.Choco解决器

安全包装.Choco解决器
EN

Stack Overflow用户
提问于 2020-07-05 21:58:09
回答 1查看 118关注 0票数 0

问题:

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

这种包装不安全。面包被压碎了,因为上面5的重量大于它的强度,4.交换苹果和面包,就可以安全地包装起来。

目标:

我需要找到解决这个问题的所有解决方案,然后测试这个解决方案是否被列举:

代码语言:javascript
复制
N=3, WS = { (5,6), (4,4), (10,10) } 

我尝试了什么:

首先我写了我的CSP模型

然后我把巧克力代码写成这样

代码语言:javascript
复制
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);

}

但我得到了这个结果:

代码语言:javascript
复制
Solution: P[0]=0, P[1]=1, P[2]=2

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-06 08:32:14

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62746763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档