首页 > 解决方案 > 多次运行求解

问题描述

我需要运行 3 次求解。每次求解都需要来自元组的不同列的不同输入。这就是为什么我需要访问 OPL 中的循环变量作为参数,并且需要在每个循环中更改该参数。请建议如何在 ODM OPL 中执行此操作。(通过在 dat 文件中引入一个 int 并在每个循环中更改其值,我可以在使用物理 .dat 文件运行独立模型时做到这一点,但在通过 ODM 应用程序运行时也是不可能的)。

标签: optimizationopl

解决方案


丹尼尔写的很好。如果您不想拥有不必要的 .dat 文件,您可以编写

子模块

tuple T {
  int round1;
  int round2;
}
T t = <1, 2>;

int param = ...;

dvar float x;

minimize x;
subject to { x >= param; }

然后在另一个将成为主要模型的模型中:

tuple T {
  int round1;
  int round2;
}
T t = <1, 2>;

main {
  thisOplModel.generate();
  var src = new IloOplModelSource("sub.mod");
  var def=new IloOplModelDefinition(src);
  var data = new IloOplDataElements();;
  for (var i = 0; i < 2; ++i) {
    if (i == 0)
       data.param = thisOplModel.t.round1;
    else
       data.param = thisOplModel.t.round2;
    var opl = new IloOplModel(def, cplex);
    opl.addDataSource(data);
    opl.generate();
    cplex.solve();
    writeln("Round " + i + ": " + cplex.getObjValue() + ", " + data.param);
    opl.end();
  }
}

这会给

Round 0: 1, 1
Round 1: 2, 2

tuple T {
  int round1;
  int round2;
}
T t = <1, 2>;

int solutions[0..1];

main {
  thisOplModel.generate();
  var src = new IloOplModelSource("sub.mod");
  var def=new IloOplModelDefinition(src);
  var data = new IloOplDataElements();;
  for (var i = 0; i < 2; ++i) {
    if (i == 0)
       data.param = thisOplModel.t.round1;
    else
       data.param = thisOplModel.t.round2;
    var opl = new IloOplModel(def, cplex);
    opl.addDataSource(data);
    opl.generate();
    cplex.solve();
    writeln("Round " + i + ": " + cplex.getObjValue() + ", " + data.param);
    thisOplModel.solutions[i]=opl.x.solutionValue;
    opl.end();
  }

  writeln(thisOplModel.solutions);
}

解决您关于填充表格的下一个问题

这使

Round 0: 1, 1
Round 1: 2, 2
 [1 2]

推荐阅读