如何在 OPL 的替代函数中创建 if 和 else?

Posted

技术标签:

【中文标题】如何在 OPL 的替代函数中创建 if 和 else?【英文标题】:How to make a if and else in alternative function in OPL? 【发布时间】:2021-02-09 02:46:58 【问题描述】:

如果收益值与计划不同,则选择备选方案 2,如果相同,则选择备选方案 1。我使用元组模式在 OPL 中使用 CP(约束编程)确定备选方案 2 我一直坚持到这部分

**subject to 
  forall (p in Precedences, m in Modes) 
 alternative(Tasks[p], all(m in Modes: m.taskId==p.id) mode[m]);**

谢谢,我需要这部分来完成我的硕士论文,因为我没有编程基础

【问题讨论】:

【参考方案1】:

你可以使用presenceOf。

using CP;

int v=1;
// if v is 1 we choose a1p[1] , if not a1p[2];

dvar interval a1;
dvar interval a1p[i in 1..2] optional size i;

subject to 
  alternative(a1, a1p);
  (v==1) == (presenceOf(a1p[1])==1);
;

execute

  writeln(a1);

给予

<1 0 1 1>

但如果我将 v=1 更改为 v=2,那么我会得到

 <1 0 2 2>

【讨论】:

【参考方案2】:

感谢您回答我的问题,我感到很幸运。这段代码适用于使用元组吗?因为我在元组中创建了我的模式?当我尝试使用范围 1..2 时,dvar 是错误的。这是我的原始代码

tuple Mode 
  key int taskId;
  key int id;
  int pt;
  int costprod;
  int dmdIntRes [IntRes];
  int dmdExtRes [ExtRes];

Mode Modes = ...;

dvar interval Tasks [p in Precedences]in p.RelDate..EndMax   ; //in p.RelDate..EndMax in 0..EndMax
dvar interval mode[m in Modes] optional  size m.pt;

cumulFunction IntResUsage[r in IntRes] = 
  sum (m in Modes: m.dmdIntRes[r]>0) pulse(mode[m], m.dmdIntRes[r]);
  
cumulFunction ExtResUsage[r in ExtRes] = 
  sum (m in Modes: m.dmdExtRes[r]>0) pulse(mode[m], m.dmdExtRes[r]);
  
execute 
        cp.param.FailLimit = 10000;

 
minimize max(p in Precedences) endOf(Tasks[p]);
subject to 
  forall (p in Precedences, m in Modes) 
 
    alternative(Tasks[p], all(m in Modes: m.taskId==p.id) mode[m]);

【讨论】:

以上是关于如何在 OPL 的替代函数中创建 if 和 else?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSF EL 中创建一个数组?

DBT 模型:如何从查询中创建变量并在 If 语句中使用它

如何从数组中创建 jQuery 对象?

如何在vue.js中创建用于创建和编辑功能的简单模式?

如何在if语句中创建数组

如何在雪花中创建一个表,但防止在同一角色下删除它?