Julia JuMP变量初始化遇MethodError报错,寻求解决方法
解决JuMP中变量X的初始化错误问题
错误原因分析
你写的@variable(MO, X[1:N, 1:En[1:N]], 1:Te[1:E] >= 0);存在索引语法错误:
1:En[1:N]中,En[1:N]返回的是向量的向量(比如En[1:2]就是机器1和2对应的需求集合组成的数组),而:运算符仅能用于整数范围(如1:5),无法和向量向量配对,因此触发MethodError。1:Te[1:E]同样存在逻辑错误,E未定义,且Te[e]本身就是时段集合,不需要用1:包裹。
正确的变量初始化方法
根据你的模型设定(n∈N,e∈E(n),t∈T(e)),有两种简洁的实现方式:
方法一:嵌套层级索引(推荐)
直接按照机器n → 需求e → 时段t的层级定义变量,JuMP会自动遍历所有合法的索引组合:
using JuMP MO = Model() # 定义集合参数 N = 2 En = [[1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9,10,11,12]] # 注意:Te的索引要覆盖所有出现的需求元素e,这里补全示例 Te = [[1,2,3,4,5,6,7,8], [1,2,3,4,5,6,7,8], [2,3,4,5,6,7,8,9], [2,3,4,5,6,7,8,9], [3,4,5,6,7,8,9,10], [3,4,5,6,7,8,9,10], [4,5,6,7,8,9,10,11], [4,5,6,7,8,9,10,11], [5,6,7,8,9,10,11,12], [1,2,3,4,5], [2,3,4,5,6], [3,4,5,6,7]] # 正确定义变量X @variable(MO, X[n=1:N, e=En[n], t=Te[e]] >= 0)
方法二:预先生成合法索引集合
先通过列表推导式生成所有有效的(n,e,t)三元组,再用这个集合定义变量,适合需要提前验证索引范围的场景:
using JuMP MO = Model() # 定义集合参数(同方法一) N = 2 En = [[1,2,3,4,5,6,7,8,9], [1,2,3,4,5,6,7,8,9,10,11,12]] Te = [[1,2,3,4,5,6,7,8], [1,2,3,4,5,6,7,8], [2,3,4,5,6,7,8,9], [2,3,4,5,6,7,8,9], [3,4,5,6,7,8,9,10], [3,4,5,6,7,8,9,10], [4,5,6,7,8,9,10,11], [4,5,6,7,8,9,10,11], [5,6,7,8,9,10,11,12], [1,2,3,4,5], [2,3,4,5,6], [3,4,5,6,7]] # 生成所有合法的(n,e,t)三元组 valid_indices = [(n, e, t) for n in 1:N for e in En[n] for t in Te[e]] # 查看索引集合(可选) # println(valid_indices) # 定义变量 @variable(MO, X[valid_indices] >= 0)
变量访问示例
- 方法一中,访问机器1、需求元素3、时段5的变量:
X[1,3,5] - 方法二中,访问同样的变量:
X[(1,3,5)]
内容的提问来源于stack exchange,提问作者leonard26ba
相关产品推荐
相关产品推荐

