我正在使用Java API用CPLEX解决LP。我使用提供的方法(例如cplex.numVar(col, lb, ub)
和cplex.addLe()
构建模型。优化完成后,我有兴趣阅读最终迭代的单纯形表(准确地说:不仅是对偶和降低了成本,而且降低了表格内部的系数)。
我试图访问IloLPMatrix对象cplex.LPMatrix()
,但这仅返回一个空矩阵。我对与刚刚解决的问题相关的“填充”矩阵很感兴趣。
所以:我如何阅读单纯形表?
谢谢!马库斯
答案 0 :(得分:0)
在
CPLEX_Studio128 \ cplex \ examples \ src \ java
您可以看一下示例
LPex1.java
致谢
答案 1 :(得分:0)
简短的答案是,您不能使用Concert(Java / .NET / C ++)API访问单纯形表格。不过,您可以使用C可调用库和Python API访问此高级功能。例如,请参见CPXXbinvarow和examining the simplex tableau in the Python API。
现在,要弄清您对board = [2, 4, 0, 2, 8, 4, 4, 8, 0, 2, 0, 0, 4, 0, 2, 2]
x=4
nb=[]
for e in zip(*[iter(board)]*x):
ne=[se for se in e if se!=0]
nb.extend(ne+[0]*(x-len(ne))) #.append if you want to maintain sub lists
>>> nb
[2, 4, 2, 0, 8, 4, 4, 8, 2, 0, 0, 0, 4, 2, 2, 0]
所做的操作可能造成的困惑,请考虑以下内容(大多数来自IBM developerWorks官方论坛上的this主题)。
如果使用IloLPMatrix
向模型添加约束,则可以使用rangeIterator来访问约束(可能还有conversionIterator,SOS1Iterator,SO2Iterator)。请注意,使用cplex.addLe()
时,必须先弄清表达式的运行时类型,然后才能获取系数。例如:
rangeIterator
另一方面,如果您使用IloLPMatrix构建模型,则可以使用LPMatrixIterator访问它。调用cplex.LPMatrix时,它“创建并返回一个空的LP矩阵对象”。然后,您必须填充它并将其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 ...) {
...
}
}
插入模型。或者,您可以使用addLPMatrix一步创建和添加(仍然需要填充)。
例如:
add
请注意,只有在使用// 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
来解决问题,并且可能需要进行一些性能折衷。您将不得不尝试两种方法。