【问题标题】:Retrieving Reduced Cost of Dvar composed of "tuples" in CPLEX OPL在 CPLEX OPL 中检索由“元组”组成的 Dvar 的降低成本
【发布时间】:2020-02-14 08:32:29
【问题描述】:

我想检索 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 = ...;

提前致谢。

【问题讨论】:

    标签: tuples cplex opl


    【解决方案1】:

    让我扩展亚历克斯的答案:您似乎试图查询 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);
      }
    }
    

    【讨论】:

      【解决方案2】:

      你可以迭代元组集。

      在 OPL CPLEX 示例中的 oil.mod 中,您可能会看到

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

      Gasolines 是一个字符串集,但也可以是一个元组集,这也可以

      【讨论】:

      • 谢谢@Alex Fleischer。我尝试了您的建议,但收到此错误:描述 IBM ILOG CPLEX:CPLEX 错误 1017:不适用于混合整数问题决策变量是浮点数,但问题是 MILP。是不是可以找回降低的成本?
      • 您好,这适用于 LP,但您可以放松完整性。见ibm.com/developerworks/community/forums/html/…
      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2020-08-20
      相关资源
      最近更新 更多