Короткий ответ: вы не можете получить доступ к симплексной таблице с помощью API-интерфейса Concert (Java / .NET / C ++). Вы можете получить доступ к этой расширенной функции с помощью библиотеки C Callable и API-интерфейсов Python. Например, см. CPXXbinvarow и , где рассматривается симплексная таблица в Python API .
Теперь, чтобы прояснить вашу возможную путаницу с тем, что делает IloLPMatrix
, рассмотрим следующее (в основном это сообщение из этой ветки на официальном форуме IBM developerWorks).
Если вы добавите ограничения к модели с помощью cplex.addLe()
, то вы можете использовать rangeIterator для доступа к ним (и, возможно, translationIterator , 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
для доступа к ней, или второй метод и LPMatrixIterator
- вопрос вкуса и, возможно, некоторые компромиссы производительности; вам придется экспериментировать с обоими подходами.