【问题标题】:Cplex OPL:eliminate some dvar in preprocessingCplex OPL:在预处理中消除一些 dvar
【发布时间】:2020-10-04 11:28:03
【问题描述】:

我有一个关于在预处理中消除一些无效决策变量组合的问题。 我有一个用 [commodities][arcs] 索引的二维决策变量 X。请参阅下面的代码。索引“commodities”基于元组“Data”。索引“arcs”基于元组“Arc” “。元组“Data”和“Arc”都基于元组“TimeNode”。 我不希望程序迭代所有 X 组合。我想删除预处理中的一些决策变量,通过考虑比较数据元组中的 Origin 时间和 Arc 元组中的 FromNode 时间的条件,如果“Origin.time>FromNode.time”,X 等于 0,因此从迭代中消除并且不被考虑。因此,问题的大小将减少并节省一些内存。我在下面做了一些示例代码,执行。例如,如果我有 {Data} 商品= {>...},1 是 id, - Origin 以 1 作为起始节点,3 是开始时间。我不需要在开始时间 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”中的决策变量。”

【问题讨论】:

    标签: cplex preprocessor opl


    【解决方案1】:

    您可以在要屏蔽的主题中写下:

    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
    {
      
    }
    

    【讨论】:

    • 完全同意 Alex 的观点,即最好的方法是只创建模型中实际需要的变量。在一些特殊情况下,在模型中包含这些额外变量可能很有用(例如,用于调试),但通常最好不要创建它们。努力使您的索引集正确,这将在您对模型的理解和减少模型大小以及(通常)更好的求解时间方面带来巨大的好处。
    • 然而,有时您需要解决线性规划松弛问题,以便找出应该消除哪些变量。在那里,使用“从模型中删除变量”功能可能会很好,而不是依靠预处理来消除具有相等下限和上限的变量。
    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2013-06-25
    • 2016-08-05
    • 2020-08-20
    • 1970-01-01
    相关资源
    最近更新 更多