1

我一直在尝试自学如何使用 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);

然后我使用背包列表添加了一个背包约束:

约束 con = new Knapsack(knapsack, knapsackCapacity, knapsackProfit); 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");
}

我得到的结果很简单,所有数量都为零,这满足了约束但没有优化任何东西。是否还有其他约束或我应该添加的东西来尝试最大化每个项目的利润*数量?

谢谢

4

1 回答 1

2

我没有使用Knapsack约束,但通常优化(最小化)你使用以下(成本作为第三个参数):

search.labeling(store, select, cost);

请注意,这会使成本最小化,因此您必须将利润转换为“负成本”。示例ExamplesJaCoP/KnapsackExample.java(结合ExamplesJaCoP/Example.java)显示了原理。但是,该示例不使用KnapsackItem,只是简单IntVar的 。

于 2010-11-29T18:23:52.827 回答