我正在使用 Java API 用 CPLEX 解决 LP。我用提供的方法(如cplex.numVar(col, lb, ub)
和cplex.addLe()
)构建我的模型优化完成后,我有兴趣阅读最终迭代的单纯形表(准确地说:不仅是对偶和降低成本,还有表内的系数) .
我试图访问 IloLPMatrix 对象cplex.LPMatrix()
,但这仅返回一个空矩阵。我对与我刚刚解决的问题相关的“填充”矩阵感兴趣。
那么,我怎样才能阅读单纯形表呢?
简短的回答是,您无法使用 Concert (Java/.NET/C++) API 访问单纯形表。不过,您可以使用 C 可调用库和 Python API 访问此高级功能。例如,请参阅CPXXbinvarow和检查 Python API 中的单纯形表。
现在,为了消除您可能对做什么的困惑IloLPMatrix
,请考虑以下内容(主要摘自IBM developerWorks 官方论坛上的此线程)。
如果您向模型添加约束,cplex.addLe()
则可以使用rangeIterator来访问它们(可能还有conversionIterator、SOS1Iterator、SO2Iterator)。请注意,当您使用时,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
,这都是个人喜好问题,也可能是一些性能权衡;您必须尝试两种方法。
CPLEX_Studio128\cplex\examples\src\java
你可以看看这个LPex1.java
例子。