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(); } }
修正后的代码说明
- 变量数组:用
model.boolVarArray(n_obj)创建了n个布尔变量,每个变量对应一个物品的选择状态; - 目标函数:每个物品的利润对应自己的变量
x[i],这样总利润就是选中物品的利润之和; - 正确的约束:把所有物品的重量乘对应变量的结果相加,总和不超过背包容量;
- 输出变量值:在求解成功后,循环调用
model.getValue(x[i])来获取每个物品是否被选中(1表示选中,0表示不选中)。
这样运行后,你就能同时看到目标函数值和每个物品的选择结果啦。
内容的提问来源于stack exchange,提问作者Emanuele Mattioli
相关产品推荐
相关产品推荐

