juMP - 使用在sum范围中定义的变量

时间:2017-07-06 16:50:44

标签: julia-jump

我试图定义一个包含两个索引k和t的求和的约束。

for i in data.I    
    for j in 1:length(data.P[i])
        @constraint(m, w[i, j, length(data.T[data.P[i][j]])]/(1+sum(data.A[i][k][t] for k in 1:length(data.P[i]), t in data.T[data.P[i][k]])) <= s[i, j])
    end
end

运行代码时出现以下错误:

  

错误:LoadError:UndefVarError:k未定义

我已经以相同的方式在OPL中为CPLEX实现了相同的模型,这不是问题。我不允许在求和中引入这样的变量作为索引,然后将它随后用作与我在上面尝试的相同sum()内的数组的索引吗?

2 个答案:

答案 0 :(得分:1)

这是Julia语法的问题:

julia> sum(i+j for i in 1:3, j in 1:i)
ERROR: UndefVarError: i not defined

julia> sum(i+j for i in 1:3 for j in 1:i)
24

同样应该适用于JuMP。

答案 1 :(得分:0)

我的同事找到了解决此问题的方法。将总和转换为等价的双和使它起作用,即:

sum(data.A[i][k][t] for k = 1:length(data.P[i]), t = data.T[data.P[i][k]]) 

更改为:

sum(sum(data.A[i][k][t] for t = data.T[data.P[i][k]]) for k = 1:length(data.P[i]))

这解决了这个问题。