如何解决Java调用CPLEX时的不可行性错误(行'c2':0=-3)
修复CPLEX线性规划模型不可行错误的解决方案
先看你遇到的错误:不可行性行'c2':0=-3,这说明你的模型里存在完全无法满足的约束,根源在于代码里的约束逻辑出现了严重冲突,我来帮你一步步梳理并修复:
错误根源分析
你的代码里有三个关键问题直接导致了模型不可行:
- 区域人员约束逻辑错误:你给每个区域添加了
cplex.addEq(numExpr, A[i].length);,也就是要求每个区域的3个子区域都必须派遣1人,这样6个区域总共需要18人,但你设置的总派遣人数只有5人,这两个约束完全矛盾,CPLEX自然会返回不可行。 - 总人数约束重复添加:你把
cplex.addLe(numExpr_total, peopleNum);放在了区域循环内部,这会导致这个约束被重复添加6次,虽然CPLEX会自动处理重复约束,但这是不必要的冗余代码。 - 目标函数方向错误:你的需求是最小化派遣成本,但代码里写的是
cplex.addMaximize(object);,方向完全搞反了。
修复后的代码
根据你的问题背景(选择派遣人员到子区域,总人数限制5人,最小化总成本),我修正了代码中的所有错误,以下是修复后的完整版本:
// 子区域成本矩阵(保留你原始的成本数据) double[][] A = new double[6][3]; A[0][0] = 999; A[0][1] = 397; A[0][2] = 698; A[1][0] = 1717; A[1][1] = 1147; A[1][2] = 1192; A[2][0] = 1752; A[2][1] = 1154; A[2][2] = 1453; A[3][0] = 2059; A[3][1] = 1528; A[3][2] = 1788; A[4][0] = 601; A[4][1] = 270; A[4][2] = 357; A[5][0] = 1113; A[5][1] = 815; A[5][2] = 928; // 决策变量:x[i][j]为1表示给第i个区域的第j个子区域派遣1人,0则不派遣 IloNumVar[][] x = new IloNumVar[6][]; for (int i = 0; i < x.length; i++) { x[i] = cplex.boolVarArray(A[i].length); } // 总人数约束:所有派遣的人员总数不超过5人 IloLinearNumExpr totalPeople = cplex.linearNumExpr(); for (int i = 0; i < A.length; i++) { for (int j = 0; j < A[i].length; j++) { totalPeople.addTerm(1.0, x[i][j]); } } cplex.addLe(totalPeople, 5); // 目标函数:最小化总成本 IloLinearNumExpr totalCost = cplex.linearNumExpr(); for (int i = 0; i < A.length; i++) { for (int j = 0; j < A[i].length; j++) { totalCost.addTerm(A[i][j], x[i][j]); } } cplex.addMinimize(totalCost); // 执行求解并输出结果 if (cplex.solve()) { System.out.println("最小总成本:" + cplex.getObjValue()); for (int i = 0; i < x.length; i++) { for (int j = 0; j < x[i].length; j++) { // 0-1变量取值大于0.5视为选中 if (cplex.getValue(x[i][j]) > 0.5) { System.out.println("派遣人员到区域" + (i+1) + "的子区域" + (j+1)); } } } } else { System.out.println("模型仍不可行,请检查约束条件"); }
额外约束扩展说明
如果你有隐藏的业务规则(比如每个区域最多只能派遣到一个子区域,或者必须覆盖特定区域),可以添加对应的约束:
- 每个区域最多选一个子区域:给每个区域添加
cplex.addLe(numExpr, 1);,其中numExpr是该区域三个x[i][j]的和。 - 必须覆盖至少N个区域:可以添加统计选中区域数量的约束,要求其大于等于N。
现在这个修复后的模型应该可以正常求解,会自动选择成本最低的5个子区域(或符合你额外约束的方案)来派遣人员。
内容的提问来源于stack exchange,提问作者E Gary
相关产品推荐
相关产品推荐

