是否可以修改范围变量?

时间:2019-05-28 15:47:11

标签: cplex opl

我需要解决一个模型,其中有一个大小为1..118的数组,但是我只想解决某些值(例如1..9,11..60,62..115和117..118)。我所排除的数字是我不想解决的数字,因为它们将返回没有价值的解决方案,因此对我而言不感兴趣。

我无法更改原始数组,因为我将使用它来解决问题的宽松版本,而以前没有采取过这些职位。

有什么可行的方法吗?

1 个答案:

答案 0 :(得分:2)

让我给您一个示例,说明如何通过OPL中的流量控制设置范围:

您有第一个模型sub.mod

int minOfx = ...;
int maxOfx = ...;
range r=minOfx..maxOfx;
dvar float x1 in r;
dvar float x2 in r;

maximize x2-x1;
subject to {

}

execute
{
writeln("x2-x1= ",x2-x1);
}

然后您有了自己的主要模型

main {
  var source = new IloOplModelSource("sub.mod");
  var cplex = new IloCplex();
  var def = new IloOplModelDefinition(source);



  for(var k=1;k<=10;k++)
  {
  var opl = new IloOplModel(def,cplex);

  var data2= new IloOplDataElements();
  data2.minOfx=(k-1)*(k-1);
  data2.maxOfx=k*k;
  opl.addDataSource(data2);
  opl.generate();

  if (cplex.solve()) {  
     opl.postProcess();

  } else {
     writeln("No solution");
  }
 opl.end();
}  

}

运行主模型时,您将得到

x2-x1= 1
x2-x1= 3
x2-x1= 5
x2-x1= 7
x2-x1= 9
x2-x1= 11
x2-x1= 13
x2-x1= 15
x2-x1= 17
x2-x1= 19

使用流控制,您可以更改模型中的某些数据,并且可以更改范围

致谢