Как получить доступ к финальной симплексной таблице в CPLEX? - PullRequest
0 голосов
/ 03 июля 2018

Я решаю LP с CPLEX, используя Java API. Я строю свою модель с помощью предоставленных методов (например, cplex.numVar(col, lb, ub) и cplex.addLe()). После завершения оптимизации мне интересно прочитать симплексную таблицу финальной итерации (чтобы быть точным: не только двойственные и сокращенные затраты, но и коэффициенты внутри таблицы).

Я пытался получить доступ к объекту IloLPMatrix cplex.LPMatrix(), но это только возвращает пустую матрицу. Меня интересует "заполненная" матрица, связанная с только что решенной проблемой.

Итак: Как мне прочитать симплексную таблицу?

Спасибо! Markus

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Короткий ответ: вы не можете получить доступ к симплексной таблице с помощью 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 - вопрос вкуса и, возможно, некоторые компромиссы производительности; вам придется экспериментировать с обоими подходами.

0 голосов
/ 03 июля 2018

в

CPLEX_Studio128 \ CPLEX \ Примеры \ SRC \ Java

Вы могли бы взглянуть на пример

LPex1.java

1009 * привет *

...