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
相关产品推荐
相关产品推荐

