OPL 如何对字符串类型周集合中截至指定周的所有元素求和
OPL字符串类型周集合累加约束实现方案
你遇到的问题核心是OPL中字符串类型不能直接用比较运算符判断时间先后,有两种常用的实现方案:
方案1:提取周名称中的数字比较(适合固定格式命名的场景)
直接通过OPL内置的字符串处理函数提取周编号比较,代码如下:
forall ( w in weeks ) { sum ( ww in weeks : asInt(substring(ww, 5)) <= asInt(substring(w, 5)) ) x[ww] >= rhs[w]; }
说明:substring(ww,5)的作用是提取周字符串中Week 之后的数字部分,asInt将其转为整数后就可以正常比较大小。该方案无需额外定义变量,适合所有周名称严格遵循Week 数字格式的场景,即使周数为两位数(如Week 10)也可以正常兼容。
方案2:预定义周顺序映射(通用场景,兼容性更高)
如果周命名格式不固定,或者后续可能新增非连续编号的周,可以提前定义周的先后顺序映射,代码如下:
// 按时间先后顺序定义周列表,同时绑定顺序编号 {string} sortedWeeks = {"Week 1","Week 2","Week 3","Week 4"}; int weekSeq[sortedWeeks] = [1,2,3,4]; // 约束部分直接用预定义的顺序编号比较 forall ( w in sortedWeeks ) { sum ( ww in sortedWeeks : weekSeq[ww] <= weekSeq[w] ) x[ww] >= rhs[w]; }
说明:该方案不依赖周的命名规则,你只需要保证sortedWeeks和weekSeq的顺序和实际时间顺序一致即可,后续新增周时只需按顺序更新这两个变量就可以正常运行。
内容的提问来源于stack exchange,提问作者Sune
相关产品推荐
相关产品推荐

