【问题标题】:How to write if condition in CPLEX OPL如何在 CPLEX OPL 中编写 if 条件
【发布时间】:2020-03-26 10:25:19
【问题描述】:

我正在创建一个名为 BlockBelow 的集合,如以下代码所示(这是更大模型的一部分)。

这样做时,我将某些块设为空 - 数据可能会为某些块提供空集。但是我想做一个检查并填充空的 BlockBelow 集,如下所示

{blockType} BlockBelow[b1 in PitBlocksType] =
     {b | b in PitBlocksType: b1.i == b.i -1 &&
                        (b1.k  == b.k ) &&
                         (b1.j  == b.j) };





execute{
for(var i in PitBlocksType){

if ( BlockBelow[i] == {} ) BlockBelow[i] = i;

writeln(i, BlockBelow[i]);
  }
} 

没有 if 行的代码在脚本日志中给出如下输出,其中可以看到需要填充的空集:

<"P74" 2 3 10> {<"P106" 3 3 10>}
 <"P75" 2 3 11> {<"P107" 3 3 11>}
 <"P76" 2 3 12> {}
 <"P77" 2 4 2> {<"P108" 3 4 2>}
 <"P78" 2 4 3> {<"P109" 3 4 3>}
 <"P79" 2 4 4> {<"P110" 3 4 4>}
 <"P80" 2 4 5> {<"P111" 3 4 5>}
 <"P81" 2 4 6> {<"P112" 3 4 6>}
 <"P82" 2 4 7> {<"P113" 3 4 7>}
 <"P83" 2 4 8> {<"P114" 3 4 8>}
 <"P84" 2 4 9> {<"P115" 3 4 9>}
 <"P85" 2 4 10> {<"P116" 3 4 10>}
 <"P86" 2 4 11> {<"P117" 3 4 11>}
 <"P87" 3 2 2> {}
 <"P88" 3 2 3> {}
 <"P89" 3 2 4> {}
 <"P90" 3 2 5> {}
 <"P91" 3 2 6> {}
 <"P92" 3 2 7> {}

if 语句出现错误。关于如何克服这个问题的任何建议 - 使用 if 或任何其他方法来实现用 i 填充空集的目标

----回答后编辑---------------

对不起,我忘了说 {blockType} 是一个元组

tuple blockType {
    key string id;
    int i;
    int j;
    int k;
 };

我尝试了 card() 函数,但它不适用于元组

【问题讨论】:

  • 提供准确的错误会很有帮助,正如 OPL 报告的那样。否则读者必须猜测......
  • 感谢 Xavier 的建议。错误是:脚本解析器错误:缺少表达式。

标签: cplex opl


【解决方案1】:

在脚本中,您不能使用 {} 作为集合的文字来表示空集合。您可以使用card() 函数来获取集合的基数。空集的基数为 0。

【讨论】:

  • 谢谢丹尼尔
【解决方案2】:

要测试你在一个集合中有多少元素:

{int} a={1};
{int} b={};

int sizea=card(a);
int sizeb=card(b);

execute
{
var sizea2=Opl.card(a);
var sizeb2=Opl.card(b);
var sizea3=a.size;
var sizeb3=b.size;

writeln(sizea,sizea2,sizea3);
writeln(sizeb,sizeb2,sizeb3);
}

给了

111
000

【讨论】:

  • 谢谢 Alex var sz= Opl.card(BlockBelow[i]) 提供尺寸。但是,我现在已经替换了另一行 if ( BlockBelow[i] == {} ) BlockBelow[i] = i;使用 if (sz==0) BlockBelow[i] = i ,这是用集合 i 填充空集合,但会报错 Scripting runtime error: not of type 'IloDiscreteDataCollection', " ”。其中 i= 是找到 sz=0 的第一行
  • 然后,我现在替换了另一行 if ( BlockBelow[i] == {} ) BlockBelow[i] = i; with if (sz==0) BlockBelow[i].add(i.id, i.i, i.j, i.k) ;, 这是用集合 i 填充空集合。最后这已经奏效了。不确定这是否是填充空集的最佳方法。再次感谢您。
猜你喜欢
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多