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

如何解决Java调用CPLEX时的不可行性错误(行'c2':0=-3)

修复CPLEX线性规划模型不可行错误的解决方案

先看你遇到的错误:不可行性行'c2':0=-3,这说明你的模型里存在完全无法满足的约束,根源在于代码里的约束逻辑出现了严重冲突,我来帮你一步步梳理并修复:

错误根源分析

你的代码里有三个关键问题直接导致了模型不可行:

  1. 区域人员约束逻辑错误:你给每个区域添加了cplex.addEq(numExpr, A[i].length);,也就是要求每个区域的3个子区域都必须派遣1人,这样6个区域总共需要18人,但你设置的总派遣人数只有5人,这两个约束完全矛盾,CPLEX自然会返回不可行。
  2. 总人数约束重复添加:你把cplex.addLe(numExpr_total, peopleNum);放在了区域循环内部,这会导致这个约束被重复添加6次,虽然CPLEX会自动处理重复约束,但这是不必要的冗余代码。
  3. 目标函数方向错误:你的需求是最小化派遣成本,但代码里写的是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:56