Получение сниженной стоимости Dvar, состоящего из "кортежей" в CPLEX OPL - PullRequest
0 голосов
/ 14 февраля 2020

Я хочу получить сокращенную стоимость переменной решения в CPLEX OPL. Однако индексы dvar являются кортежами, и cplex не может выполнить итерации по кортежу для вывода сокращенных затрат. Это невозможно с кортежами или есть способ для этого? Например, есть переменная решения, как показано ниже:

dvar float+ Production[ProductionLocations][TimePeriods];

tuple timeperiod {
  string TimePeriodID;
  string TimePeriodName;
  float CurrencyRate;
  float Rank;
  string ActivePeriod;
}
{timeperiod} TimePeriods = ...;
tuple productionlocation { 
  string ProductID;
  string ProductName;
  string LocationID;
  string LocationName;
}
{productionlocation} ProductionLocations = ...;

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Позвольте мне расширить ответ Алекса: кажется, вы пытаетесь запросить двойные значения для MIP. Однако двойные значения не определены для MIP. У вас есть два варианта:

  1. Вы можете ослабить все переменные и решить ослабленную задачу. Это LP и, таким образом, обеспечит дуалы. Однако это может быть не слишком полезно.
  2. Вы можете вычислить оптимальное решение MIP, исправить все целочисленные переменные и затем решить оставшуюся проблему. Это снова LP и, таким образом, даст двойные значения. Эти двойные значения могут быть более значимыми, чем значения, которые вы получаете от расслабления всего.

Для выполнения второго действия вы все равно можете использовать сценарии:

main {
  thisOplModel.generate();
  cplex.solve(); // Compute integer optimal solution
  cplex.solveFixed(); // Fix integer variables to optimal values, solve LP
  // query your dual values:
  for (var g in Gasolines) {
    writeln("a[",g,"].reducedCost = ",a[g].reducedCost);
  }
}
0 голосов
/ 14 февраля 2020

вы можете перебирать набор кортежей.

В oil.mod в примерах OPL CPLEX вы можете увидеть

execute DISPLAY_REDUCED_COSTS{
  for( var g in Gasolines ) {
    writeln("a[",g,"].reducedCost = ",a[g].reducedCost);
  }
}

Бензины - это набор строк, но это может быть набор кортежей, это будет работа тоже

...