如何访问CPLEX中的最终单纯形表?

时间:2018-07-03 13:44:46

标签: java cplex simplex

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

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

所以:我如何阅读单纯形表?

谢谢!马库斯

2 个答案:

答案 0 :(得分:0)

CPLEX_Studio128 \ cplex \ examples \ src \ java

您可以看一下示例

LPex1.java

致谢

答案 1 :(得分:0)

简短的答案是,您不能使用Concert(Java / .NET / C ++)API访问单纯形表格。不过,您可以使用C可调用库和Python API访问此高级功能。例如,请参见CPXXbinvarowexamining 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来访问约束(可能还有conversionIteratorSOS1IteratorSO2Iterator)。请注意,使用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来解决问题,并且可能需要进行一些性能折衷。您将不得不尝试两种方法。