您好,我正在尝试使用 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 初学者,我希望它对其他人有用。

玩得开心


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!