【问题标题】:How do i solve CPLEX with Java : Infeasibility row 'c2': 0 = -3我如何使用 Java 解决 CPLEX:不可行行 'c2': 0 = -3
【发布时间】:2018-05-19 09:14:12
【问题描述】:

我试图解决LP,但它不能解决它......

问题是如果我有六个区域需要派一些人去那里建造房子。 6个区域内相互有一些子区域,每个子区域的费用不同,一个子区域只需要一个人,但所有子区域一个区域一个人可以使用。

例如:

我有五个人可以派遣

面积 A1--->3个子区:A11,A12,A13

A2--->3个子区域:A21,A22,A23

A3--->3个子区域:A31,A32,A33

A4--->3个子区:A41,A42,A43

A5--->3个子区:A51,A52,A53

A6--->3个子区:A61,A62,A63

现在我使用 cplex 选择派遣人员的最低成本,如果我假设 A1 具有最低成本,那么我将三个人派遣到 A11、A12、A13。

那我剩下两个人可以派,但是没有一个区域有两个子区域,所以我不能再派了。

使用此代码

double[][] A = new double[6][];
A[0] = new double[3];
A[1] = new double[3];
A[2] = new double[3];
A[3] = new double[3];
A[4] = new double[3];
A[5] = new double[3];

//cost of sub area
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 for decision variable, if I dispatch person to sub area x = 1.
IloNumVar[][] x = new IloNumVar[6][];

for (int i = 0; i < x.length; i++) {

    x[i] = cplex.boolVarArray(A[i].length);

}



 IloLinearNumExpr numExpr_total = cplex.linearNumExpr();

    for (int i = 0; i < A.length; i++) {

        IloLinearNumExpr numExpr = cplex.linearNumExpr();           

        for (int j = 0; j < A[i].length; j++) {

            numExpr.addTerm(1.0, x[i][j]);

            numExpr_total.addTerm(1.0, x[i][j]);

       }

       cplex.addEq(numExpr, A[i].length);           
       cplex.addLe(numExpr_total, peopleNum);

    }

    loLinearNumExpr object = cplex.linearNumExpr();

    for (int i = 0; i < A.length; i++) {

        for (int j = 0; j < A[i].length; j++) {

             object.addTerm(A[i][j], x[i][j]);

        }

    }

cplex.addMaximize(object);

所以当我执行程序时,我会显示错误

CPXPARAM_Read_APIEncoding "UTF8"

不可行行'c2':0 = -3。

预求解时间 = 0.00 秒。 (0.01 滴答声)

我该如何解决?

【问题讨论】:

  • 通常,调试 Cplex 代码的一个好方法是写出 LP 文件并查看实际生成的模型。
  • 您定义问题的方式,一些变量被强制为零,但是您使总和等于 3。您调试的最简单方法是编写使用 IloCplex.exportmodel() 将 LP 输出到文本文件
  • 我使用了 cplex.exportModel("lpex1.lp") ,它显示 -> 默认变量名称 x1, x2 ...正在创建。默认行名 c1, c2 ...正在创建。这是什么意思?

标签: java cplex


【解决方案1】:

正如 Erwin 所说,检查模型的 .lp 文件通常是开始调试的最佳方式。但是,我经常遇到不可行行的根本原因并不明显,因为涉及到其他几个错误的约束或界限。在这些情况下,CPLEX 提供了一个“冲突细化器”,可帮助您缩小潜在因果模型成员的范围。 Here 是您使用 JAVA API 调用该工具的方式。

【讨论】:

  • 好的,我会努力解决的。感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多