Cplex OPL:在预处理中消除一些dvar

问题描述

我有一个关于在预处理中消除一些无效的决策变量组合的问题。 我有一个用[商品] [弧]索引的二维决策变量X。请参见下面的代码。索引“商品”基于元组“数据”。索引“弧”基于元组“ Arc”元组“ Data”和“ Arc”均基于元组“ TimeNode”。 我不希望该程序迭代所有X组合。我想通过考虑以下条件来删除预处理中的某些决策变量:比较Data元组中的Origin时间和Arc元组中的FromNode时间,如果“ Origin.time> FromNode.time”,X等于0,因此从迭代中消除,不被考虑。因此,问题的大小将减小,并节省了一些内存。我在下面用执行做了一些示例代码。例如,如果我有{Data}商品= { > ...},则1是id,-以1作为起始节点,3是a开始时间。我不需要在开始时间3之前考虑所有X的问题。
但是,由于X是决策变量,因此执行无效。我该怎么办?将条件表述为约束?谢谢。我会提出任何建议。

  tuple TimeNode { 
  int node;
  int time;}
  {TimeNode} tnodes = { <n,t> | n in Nodes,t in Time };

  tuple Data{            
  int id;
  TimeNode Origin;           
  TimeNode Destination; }
  {Data} commodities= {<1 <1 3><2 8>>,<2 <2 5><3 10>>};

  tuple Arc {  
  TimeNode FromNode      
  TimeNode ToNode; }
  {Arc} arcs={<<i,s>,<j,e>> | <i,j> in st_arcs,s in Time,e in Time };

  dvar float+ x[commodities][arcs];

  execute {
       for(var c in commodities){
         for(var a in arcs){
           if(c.Origin.time>a.FromNode.time)
            x[c][a]=0;
         }
       }
  }

错误:无法在“ x#0#0”中分配决策变量。”

解决方法

您可以将其写在要屏蔽的主题中

subject to
  {
    forall( c in commodities,a in arcs:c.Origin.time>a.FromNode.time) x[c][a]==0;
  }

例如

{int} s={1,2};

dvar int x[s] in 0..10;

maximize sum(i in s) x[i];
subject to
{
  forall(i in s:i<=1) x[i]==0;
}

工作正常

并且优于

{int} s={1,2};

dvar int x[s] in 0..10;

execute
{
  for(var i in s) if (i<=1) x[i].UB=0;
}

maximize sum(i in s) x[i];
subject to
{
  //forall(i in s:i<=1) x[i]==0;
}

看起来像你试图写的东西

但是最好的方法通常是建立一个新集合,然后为有意义的子集设置决策变量:

{int} s={1,2};
{int} s2={i | i in s :i>1};

dvar int x[s2] in 0..10;



maximize sum(i in s2) x[i];
subject to
{
  
}