0

我正在使用 Java API 用 CPLEX 解决 LP。我用提供的方法(如cplex.numVar(col, lb, ub)cplex.addLe())构建我的模型优化完成后,我有兴趣阅读最终迭代的单纯形表(准确地说:不仅是对偶和降低成本,还有表内的系数) .

我试图访问 IloLPMatrix 对象cplex.LPMatrix(),但这仅返回一个空矩阵。我对与我刚刚解决的问题相关的“填充”矩阵感兴趣。

那么,我怎样才能阅读单纯形表呢?

4

2 回答 2

0

简短的回答是,您无法使用 Concert (Java/.NET/C++) API 访问单纯形表。不过,您可以使用 C 可调用库和 Python API 访问此高级功能。例如,请参阅CPXXbinvarow检查 Python API 中的单纯形表

现在,为了消除您可能对做什么的困惑IloLPMatrix,请考虑以下内容(主要摘自IBM developerWorks 官方论坛上的此线程)。

如果您向模型添加约束,cplex.addLe()则可以使用rangeIterator来访问它们(可能还有conversionIteratorSOS1IteratorSO2Iterator)。请注意,当您使用时,rangeIterator您必须先确定表达式的运行时类型,然后才能获得系数。例如:

for (Iterator it = cplex.rangeIterator(); it.hasNext(); /* nothing */) {
   IloRange range = (IloRange)it.next();
   IloNumExpr expr = range.getExpr(); // Cannot get the coefficients of expr directly :-(
   if (expr instanceof IloLinearNumExpr) {
      IloLinearNumExpr linExpr = (IloLinearNumExpr)expr;
      for (IloLinearNumExprIterator jt = linExpr.linearIterator(); jt.hasNext(); /* nothing */) {
          IloNumVar var = jt.nextNumVar();
          double coef = jt.getValue();
          ...
       }
   }
   else if (expr instance of ...) {
      ...
   }
}

另一方面,如果您使用IloLPMatrix构建模型,则可以使用LPMatrixIterator访问它。当您调用cplex.LPMatrix时,它“创建并返回一个空的 LP 矩阵对象”。然后,您必须将其填充add到模型中。或者,您可以使用addLPMatrix 一步创建和添加它(您仍然需要填充它)。

例如:

// Create a matrix in which we setup the model.
IloLPMatrix matrix = cplex.LPMatrix();

// Create variables.
IloNumVar x = cplex.numVar();
IloNumVar y = cplex.numVar();
matrix.addCols(new IloNumVar[]{ x, y });

// Create constraint x + y <= 2.
IloLinearNumExpr lhs = cplex.linearNumExpr();
lhs.addTerm(x, 1.0);
lhs.addTerm(y, 1.0);
matrix.addRow(cplex.le(lhs, 2.0));

// When all constraints are setup add the matrix to the model.
cplex.add(matrix);

请注意,您只能在使用IloLPMatrix.

无论您是使用第一种方法来构建模型并rangeIterator访问它,还是使用第二种方法 and LPMatrixIterator,这都是个人喜好问题,也可能是一些性能权衡;您必须尝试两种方法。

于 2018-07-03T17:55:02.100 回答
0

CPLEX_Studio128\cplex\examples\src\java你可以看看这个LPex1.java例子。

于 2018-07-03T16:30:06.323 回答