如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章