【问题标题】:OPL_ Summing over elements up to certain elementOPL_ 对元素求和直到某个元素
【发布时间】:2021-11-15 11:50:40
【问题描述】:

假设我有一组星期

{string} weeks ={"Week 1","Week 2","Week 3","Week 4"}

然后我为每个星期定义一个变量

dvar boolean x[weeks];

如果我想,对于所有w in Weeks,将所有周的总和直到第 w 周,你怎么能这样做?我想要做的是以下,它不起作用,因为我无法比较这样的字符串

forall ( w in weeks )
{
  sum ( ww in weeks : ww<=w ) x[ww] >= rhs[w];
}

rhs[w] 就在右手边。

【问题讨论】:

    标签: cplex opl


    【解决方案1】:

    巧合的是,我偶然发现了OPL manual 中的一个页面,描述了函数ord(),这似乎是一个前进的方向。 ord(Set,element) 返回集合中元素的位置。因此问题中的代码应该是

    forall ( w in weeks )
    {
      sum ( ww in weeks : ord(weeks,ww)<=ord(weeks,w) ) x[ww] >= rhs[w];
    }
    

    【讨论】:

      【解决方案2】:

      其实你可以在 OPL 中比较字符串所以

      {string} weeks ={"Week 1","Week 2","Week 3","Week 4"};
      
      float rhs[weeks]=[1,2,3,4];
      
      dvar boolean x[weeks];
      
      subject to
      {
        forall ( w in weeks )
         {
           sum ( ww in weeks : ww<=w ) x[ww] >= rhs[w];
         }
      }
      
      execute
      {
        for(var w1 in weeks) for(var w2 in weeks) if (w1<=w2) writeln(w1," <= ",w2);
      }
      

      工作正常并提供

      Week 1 <= Week 1
      Week 1 <= Week 2
      Week 1 <= Week 3
      Week 1 <= Week 4
      Week 2 <= Week 2
      Week 2 <= Week 3
      Week 2 <= Week 4
      Week 3 <= Week 3
      Week 3 <= Week 4
      Week 4 <= Week 4
      

      【讨论】:

      • 我想这需要数周。如果我例如有一组天{星期一,星期四,星期三,星期四,星期五},那么我不能只比较字符串。
      • 正确。那你最好用 ord
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      相关资源
      最近更新 更多