You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OPL递归求和约束编写求助:实现截至指定下标的累加约束

解决OPL中前缀累加约束的问题

我来帮你梳理下当前代码的问题,以及如何实现你需要的「递归累加至当前j作为求和上限」的约束:

你的代码存在的核心问题

  1. 变量名冲突:外层forall循环已经用了j作为遍历变量,内层sum里又重复使用j in days,这会导致OPL解析时混淆变量,直接引发语法或逻辑错误。
  2. 求和范围错误:当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:57:37