我一直在努力教自己如何使用JaCoP约束编程库,但是我在实现0/1背包问题时遇到了一些困难。我已经尝试了4的问题大小,并按如下方式定义了项目和变量:
knapsack[0] = new KnapsackItem(quantity[0], 5, 7);
knapsack[1] = new KnapsackItem(quantity[1], 7, 9);
knapsack[2] = new KnapsackItem(quantity[2], 2, 3);
knapsack[3] = new KnapsackItem(quantity[3], 3, 3);
IntVar knapsackCapacity = new IntVar(store, "capacity", 0, 10);
IntVar knapsackProfit = new IntVar(store, "profit", 0, 22);
然后我使用背包列表添加了一个Knapsack约束:
Constraint con = new Knapsack(背包,背包容量,背包利润); store.impose(CON);
然后我按照教程中给出的方式搜索了一个解决方案:
//search for a solution and print results
Search<IntVar> search = new DepthFirstSearch<IntVar>();
SelectChoicePoint<IntVar> select = new InputOrderSelect<IntVar>(store, quantity,
new IndomainMin<IntVar>());
boolean result = search.labeling(store, select);
if (result) {
System.out.println("Solution: "+quantity[0]+", "+quantity[1]+", "+quantity[2]+", "+quantity[3]);
} else {
System.out.println("*** No");
}
我得到的结果很简单,所有数量都是零,满足约束但不优化任何东西。是否还有其他约束或我应该添加的东西来尝试并最大化每个项目的利润*数量?
谢谢
本
答案 0 :(得分:2)
我没有使用Knapsack
约束,但通常要优化(最小化)您使用以下(成本作为第三个参数):
search.labeling(store, select, cost);
请注意,这样可以最大限度地降低成本,因此您必须将利润转换为“负成本”。示例ExamplesJaCoP/KnapsackExample.java
(与ExamplesJaCoP/Example.java
结合使用)显示了原则。但是,该示例不使用KnapsackItem
,只使用普通IntVar
。