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 таким же образом, и это не было проблемой. Разве мне не разрешено вводить такую ​​переменную в качестве индекса при суммировании, а затем использовать ее в качестве индекса для массива в той же сумме (), которую я пытаюсь сделать выше?


person dylee    schedule 06.07.2017    source источник


Ответы (2)


Это вопрос синтаксиса Джулии:

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.

person mlubin    schedule 07.07.2017

Мой коллега нашел способ обойти эту проблему. Преобразование суммы в эквивалентную двойную сумму заставило его работать, то есть:

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]))

Это решает проблему.

person dylee    schedule 06.07.2017