You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java+CPLEX 12.8单背包问题求解仅输出目标函数值的疑问

解决CPLEX单背包问题仅输出目标值的问题

嘿,我帮你瞅了下你的代码,问题其实挺明显的——不光是没输出变量取值,你的模型本身就写错了,咱们一步步来捋清楚:

你的代码存在的核心问题

1. 变量定义错误

背包问题里,每个物品都需要一个独立的布尔变量(用来标记是否选中该物品),但你只创建了一个布尔变量x:

IloNumVar x = model.boolVar();

这显然不对,应该创建一个长度为物品数量n_obj的布尔变量数组。

2. 约束条件完全不符合背包问题逻辑

你在循环里给每个物品都添加了两个错误的约束:

model.addLe(model.prod(weight[i], x), capacity) ;
model.addEq(x, 1);
  • addEq(x,1)会强制这个唯一的x必须等于1,相当于所有物品都被选中(因为你把所有利润都加到这个x上了);
  • 每个物品单独的weight[i] * x ≤ capacity约束完全没有意义,背包问题的正确约束是所有选中物品的总重量之和不超过背包容量。

修正后的完整代码

public static void solveModel(){
 try {
    int n_obj = 5;
    int capacity = 4;
    int[] weight = new int[n_obj]; // 补上你遗漏的weight数组定义
    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.boolVarArray(n_obj);

    // 构建目标函数:最大化总利润
    IloLinearNumExpr obj = model.linearNumExpr();
    for(int i = 0; i < n_obj; i++){
        obj.addTerm(profits[i], x[i]); // 每个物品的利润对应自己的变量x[i]
    }
    model.addMaximize(obj);

    // 构建背包约束:总重量不超过容量
    IloLinearNumExpr weightConstraint = model.linearNumExpr();
    for(int i = 0; i < n_obj; i++){
        weightConstraint.addTerm(weight[i], x[i]);
    }
    model.addLe(weightConstraint, capacity);

    // 求解并输出结果
    if (model.solve()) {
        System.out.println("Obj = " + model.getObjValue());
        // 输出每个物品的选中状态
        for(int i = 0; i < n_obj; i++){
            System.out.println("物品 " + i + " 是否选中:" + model.getValue(x[i]));
        }
    } else {
        System.out.println("Problem not solved");
    }
    model.end();
 } catch (IloException e) {
    e.printStackTrace();
 }
}

修正后的代码说明

  1. 变量数组:用model.boolVarArray(n_obj)创建了n个布尔变量,每个变量对应一个物品的选择状态;
  2. 目标函数:每个物品的利润对应自己的变量x[i],这样总利润就是选中物品的利润之和;
  3. 正确的约束:把所有物品的重量乘对应变量的结果相加,总和不超过背包容量;
  4. 输出变量值:在求解成功后,循环调用model.getValue(x[i])来获取每个物品是否被选中(1表示选中,0表示不选中)。

这样运行后,你就能同时看到目标函数值和每个物品的选择结果啦。

内容的提问来源于stack exchange,提问作者Emanuele Mattioli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:55:14