Julia JuMP用元组数组做变量索引报UndefVarError如何解决?
问题原因
JuMP的@variable宏没有内置元组自动拆包的语法支持,你写的δ[(i,j)=Ω]中的i、j属于未被宏识别的声明变量,因此触发UndefVarError。你尝试的...展开语法是Julia的参数解构/展开语法,不适用于优化变量的索引声明场景。
修正方案
方案1:直接用元组作为单索引(最简单)
不需要对Ω做额外处理,直接将整个元组作为变量的单维索引即可,代码如下:
Ω = [(i,j) for i in V, j in tildeV if i != j && ŷ[i] < .5 && s[i,j] == sim_i[i]] @variable(m, δ[Ω] >= 0)
调用变量时用元组作为下标即可,示例:δ[(1,2)]。
你提供的最小复现示例修正后可直接运行:
using JuMP m = Model() Ω = [(i,j) for i in 1:5, j in 1:5] @variable(m, δ[Ω] >= 0)
方案2:保留双下标访问格式
如果你习惯用δ[i,j]的双下标调用方式,可以先提取Ω中所有的i、j取值集合,再通过索引过滤条件声明变量:
Ω = [(i,j) for i in V, j in tildeV if i != j && ŷ[i] < .5 && s[i,j] == sim_i[i]] I = unique(first.(Ω)) J = unique(last.(Ω)) @variable(m, δ[i=I, j=J; (i,j) in Ω] >= 0)
该写法只会生成Ω中存在的索引对对应的变量,不会生成多余的无效变量,同时支持双下标访问。
内容的提问来源于stack exchange,提问作者JKHA
相关产品推荐
相关产品推荐

