java - java 上的背包问题 - 输出始终为目标函数

标签 java cplex knapsack-problem

您好,我正在尝试使用 java 和 cplex 12.8 创建并解决一个只有 1 个箱子的简单背包问题。我不明白为什么它总是在输出中给出目标函数的值。 这是我的完整代码:

    public static void solveModel(){       

        try {

            n_obj = 5;
            int capacity = 4

            int[] profits = new int[n_obj];
            for(int i = 0; i < n_obj; i++ ){
                weight[i] = ThreadLocalRandom.current().nextInt(1, n_obj/2 + 1);
                profits[i] = ThreadLocalRandom.current().nextInt(1, 12);
            }


            for(int i = 0; i < weight.length; i++){
                System.out.println("Weight " + i + ":\t" + weight[i]);
                System.out.println("Profit " + i + ":\t" + profits[i]);

            }

            IloCplex model = new IloCplex();
            IloNumVar x = model.boolVar();



            IloLinearNumExpr obj = model.linearNumExpr();
            for(int i = 0; i < n_obj; i++){
                obj.addTerm(profits[i], x);
            }

            //obj function
            model.addMaximize(obj);

            //constraints

            for(int i = 0; i < n_obj; i++){
                model.addLe(model.prod(weight[i], x), capacity) ;
                model.addEq(x, 1);

            }

            if (model.solve()) {

                System.out.println("Obj = " + model.getObjValue());
            }
            else {
                System.out.println("Problem not solved");
            }

            model.end();



        } catch (IloException e) {
            e.printStackTrace();
        }

    }

我将 n_obj 和容量设置为固定值,以使其尽可能简单。 每次的输出都是这样的:

Weight 0:   1
Profit 0:   2
Weight 1:   1
Profit 1:   11
Weight 2:   2
Profit 2:   2
Weight 3:   1
Profit 3:   7
Weight 4:   2
Profit 4:   6
Found incumbent of value 28.000000 after 0.00 sec. (0.00 ticks)

Root node processing (before b&c):
Real time             =    0.00 sec. (0.00 ticks)
Parallel b&c, 8 threads:
  Real time             =    0.00 sec. (0.00 ticks)
  Sync time (average)   =    0.00 sec.
  Wait time (average)   =    0.00 sec.
                      ------------
Total (root+branch&cut) =    0.00 sec. (0.00 ticks)
Obj = 28.0

最佳答案

好吧,对于那些现在或将来感兴趣的人......我自己解决了。 boolean 变量的声明是这样完成的:

IloNumVar[] x = new IloNumVar[n_obj];
for (int i = 0; i < n_obj; i++) {
//x[i] = model.numVar(0, Double.POSITIVE_INFINITY, IloNumVarType.Bool, "x[" + i + 
//"]");
    x[i] = model.boolVar();
}

我修改了约束:

 IloLinearNumExpr lin = model.linearNumExpr();
        for (int i = 0; i < n_obj; i++) {
            //model.addLe(model.prod(weight[i], x[i]), capacity);
            lin.addTerm(x[i], weight[i]);
        }

        model.addLe(lin, capacity, "Constraints");

我知道这是一个简单的背包问题,但我是一个 cplex 初学者,我希望它对其他人有用。

玩得开心

关于java - java 上的背包问题 - 输出始终为目标函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55426858/

相关文章:

java - 创建用于读取/写入HDFS数据的JSON服务

java - 保存对象的属性

mathematical-optimization - 求解整数线性规划 : why are solvers claiming a solvable instance is infeasible?

c++ - 两个包的背包算法

algorithm - 平衡分区 vs 背包 1/0 复杂度

java - 在 Java/PHP/Python 框架内运行已编译的 C/C++ 代码中的算法?

java - Java 中的轻量级线程?

python - CPLEX 的 Python 中的 Bender 分解示例

java - 打印 CPLEX 消除了行、列和替换

algorithm - 我的 Knapsack 递归解决方案可以改进吗?