OPL递归求和约束编写求助:实现截至指定下标的累加约束
解决OPL中前缀累加约束的问题
我来帮你梳理下当前代码的问题,以及如何实现你需要的「递归累加至当前j作为求和上限」的约束:
你的代码存在的核心问题
- 变量名冲突:外层
forall循环已经用了j作为遍历变量,内层sum里又重复使用j in days,这会导致OPL解析时混淆变量,直接引发语法或逻辑错误。 - 求和范围错误:当前
sum(j in days)是对所有days中的元素求和,而非从第一个元素到当前j的前缀累加,完全不符合你要的「j=3时求和x₁+x₂+x₃」的需求。
修正后的代码
要实现前缀累加约束,你需要明确限定求和的范围是「所有小于等于当前j的days元素」,代码如下:
forall(i in subjects, j in days) sum(k in days: k <= j) x[i][k] <= i.PageNumber*(1 - a[i][j]);
代码解释
- 把内层求和的变量改为
k,避免和外层的j冲突; - 通过
k <= j的条件,让求和只覆盖days中从第一个元素到当前j的所有项,完美实现你要的「前j项累加和≤上限」的逻辑; - 如果你的
days是连续整数集合(比如1..5),这个条件直接生效;如果days是离散的非整数有序集合,OPL会按照集合定义的顺序来判断k <= j的关系。
额外提示
如果你的days集合不是默认有序的,建议先将其定义为有序集合,确保前缀累加的顺序符合预期:
ordered Days = ...; // 定义有序的天数集合 forall(i in subjects, j in Days) sum(k in Days: k <= j) x[i][k] <= i.PageNumber*(1 - a[i][j]);
内容的提问来源于stack exchange,提问作者osygl
相关产品推荐
相关产品推荐

