Julia JuMP中定义维度依赖的多维线性规划变量问题
解决JuMP中按关联索引定义变量的问题
方案1:修正@variable宏的索引语法
你之前用了列表推导式的写法,这不符合JuMP @variable 宏的语法要求,改成i in 集合的索引声明形式就能直接关联i对应的j范围:
using JuMP # 初始化模型 m = Model() # 定义索引集合 I = 1:3 J = [1:2, 1:5, 1:3] # 正确定义变量 @variable(m, e[i in I, j in J[i]])
这样定义后,就能正常调用e[1,1]、e[2,5]、e[3,3]这类变量,JuMP会自动生成所有合法的索引组合,不存在的组合(比如e[1,3])会直接报错,完全符合你的需求。
方案2:预先生成合法索引对(兼容旧版本JuMP)
如果你的JuMP版本较低,方案1无法生效,可以先手动生成所有合法的(i,j)索引对,再基于这个集合定义变量:
using JuMP m = Model() I = 1:3 J = [1:2, 1:5, 1:3] # 生成所有合法的索引组合 valid_pairs = [(i, j) for i in I for j in J[i]] # 定义变量 @variable(m, e[valid_pairs])
这种方式下变量调用形式是e[(1,1)],如果想要保持e[1,1]的调用格式,可以借助AxisArrays包转换:
using AxisArrays # 转换为轴数组,支持二维索引调用 e_axis = AxisArray(e, Axis{:i}(I), Axis{:j}(vcat(J...))) # 此时可直接用e_axis[1,1]访问变量
优先推荐方案1,这是JuMP的标准写法,只要版本在0.21及以上都能正常使用。
内容的提问来源于stack exchange,提问作者Ali Fradi
相关产品推荐
相关产品推荐

