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

时间:2019-03-30 00:01:05

标签: java cplex knapsack-problem

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

optional func mapView(_ mapView: MGLMapView, regionDidChangeAnimated animated: Bool)

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

    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();
        }

    }

2 个答案:

答案 0 :(得分:1)

好吧,对于那些感兴趣的人……我自己解决了。 布尔变量的声明已通过以下方式完成:

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");

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

玩得开心

答案 1 :(得分:0)

CPLEX以目标值为28计算出了您问题的最佳解决方案。

默认情况下,CPLEX以完全确定性的方式运行。也就是说,当在相同条件下(要解决的问题相同,机器相同等)多次运行时,CPLEX将始终返回完全相同的结果。因此,当您多次运行程序时,没有理由期望使用不同的解决方案。