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

JuMP约束中依赖数组的实现:如何编写s取值随d、a限定的约束

Julia JuMP 约束编写方案

你需要实现的约束公式如下:
约束公式

原代码问题说明

  • 变量定义阶段未限制s的有效范围,生成了大量冗余二进制变量,提升了不必要的模型求解复杂度
  • 约束的索引定义和内层sum循环重复声明了变量j,出现索引冲突,同时s的范围绑定了单个j的d[j]:a[j],但sum遍历所有j,导致s范围和j的匹配逻辑错误

推荐实现方式(最优,减少冗余变量)

直接在变量定义阶段限制每个j对应的s的有效取值范围,不需要额外约束:

using JuMP
import Cbc # 可替换为你使用的对应求解器

# 初始化模型
model = Model(Cbc.Optimizer)

# 基础参数定义
N = 5
T = 3
S = 6
Cap = 15
Q = rand(1:5, N)
d = [1,2,2,3,1]
a = [6,4,5,6,4]

# 变量定义:仅为每个j创建s在d[j]~a[j]范围内的x变量
@variable(model, x[j=1:N, t=1:T, s in d[j]:a[j]], Bin)

# 容量约束:对每个时间步t、每个s取值,所有s在有效范围内的x对应容量和不超过上限
@constraint(model, [t=1:T, s=1:S], sum(x[j,t,s] * Q[j] for j in 1:N if s in d[j]:a[j]) <= Cap)

兼容原变量定义的实现方式

如果你需要保留s全范围1:S的变量定义,可以通过补充无效值固定为0的方式实现:

@variable(model, x[j=1:N,t=1:T,s=1:S], Bin)

# 先固定不在有效范围内的x变量强制为0
@constraint(model, [j=1:N, t=1:T, s=1:S; s < d[j] || s > a[j]], x[j,t,s] == 0)

# 容量约束
@constraint(model, [t=1:T, s=1:S], sum(x[j,t,s] * Q[j] for j=1:N) <= Cap)

内容的提问来源于stack exchange,提问作者Mahsa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:48:01