optimization - If else 在 CPLEX OPL 中的日期
问题描述
我想做,如果第 15 天的总生产任务“i”* 持续时间 <= 不等于我们的目标,则选择替代 2,否则选择替代 1。我在元组上制作了数据。但我仍然无法确定在第 x 天计算的结果必须或多或少。这是我的模型。
Tuple Precedence {
key int id;
{int} succs;
int RelDate;
int VolCost;
}
{Precedence} Precedences = ...;
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;
//dvar boolean m1 [m in Modes];
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])
这是我的模式元组数据示例
Modes = {
< 0, 1, 3, 700000,[ 2 ], [ 0 ] >,
< 0, 2, 2, 1060000,[ 2 ], [ 1 ] >,
< 1, 1,24, 70313,[ 2 ], [ 0 ] >,
< 1, 2,20, 80357,[ 2 ], [ 1 ] >,
< 2, 1,24, 143750,[ 5 ], [ 0 ] >,
< 2, 2,20, 164286,[ 5 ], [ 1 ] >,
< 3, 1, 5, 1500000,[ 6 ], [ 0 ] >,
解决方案
如如何在 OPL 中的替代函数中创建 if 和 else 中所述?
你可以依靠存在
使用您的 .dat
Modes = {
< 0, 1, 3, 700000,[ 2 ], [ 0 ] >,
< 0, 2, 2, 1060000,[ 2 ], [ 1 ] >,
< 1, 1,24, 70313,[ 2 ], [ 0 ] >,
< 1, 2,20, 80357,[ 2 ], [ 1 ] >,
< 2, 1,24, 143750,[ 5 ], [ 0 ] >,
< 2, 2,20, 164286,[ 5 ], [ 1 ] >,
< 3, 1, 5, 1500000,[ 6 ], [ 0 ] >,
};
.mod
using CP;
int EndMax=100;
range IntRes=1..1;
range ExtRes=2..2;
tuple Precedence {
key int id;
}
{Precedence} Precedences = {<1>};
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 1..1000;
dvar interval mode[m in Modes] optional size m.pt;
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]);
}
// if then with presenceOf
forall (p in Precedences)
(lengthOf(Tasks[p])>=15) == presenceOf(mode[first(Modes)]);
}
工作,可以帮助你的语法
推荐阅读
- reactjs - 无法将重新布局方法应用于图表,react-plotly.js
- html - 为禁用的 Mat-Expansion 面板设置样式
- python - 为串联的 pandas df 进行唯一的枚举
- python - 在列值上绘制堆积条形图
- javascript - 带有 .utc 的 toDate 使用本地时区
- reactjs - 如何避免弹出组件中的自动关闭?
- python - 如何使用 nltk 将令牌列表转换为 wordnet 引理列表?
- angular - 在 angular2+ 中定义模型类的好处
- c++ - CMake - 无法链接共享库(子目录)
- solace - 使用 AMQP/qpid-proton 将 python dict 发布到 Solace 时出错