Решение для запросов JuMP не работает в цикле - PullRequest
1 голос
/ 03 марта 2020

Я использую JuMP v0.20.0 с оптимизатором Ipopt и пытаюсь решить систему нелинейных уравнений в al oop, где постановка задачи меняется в зависимости от того, над чем я работаю.

Предположим, у меня есть действительно простая проблема - попытаться выбрать $$ t_1, \ dots, t_n $$, чтобы минимизировать нелинейное уравнение $$ \ sum_ {i = 1 до N} t_i ^ 2 $$. Когда я запускаю это без зацикливания, у меня есть следующий код

using JuMP, Optim, Ipopt, NLsolve
m = Model(Ipopt.Optimizer)
@variable(m, t[1:N] >= 0.00000001)


function solve_Aik(tlist...)                            
    t = collect(tlist)
    return sum([t[i]^2 for i in 1:N])
end

register(m, :solve_Aik, N, solve_Aik, autodiff=true)
@NLobjective(m, Min, solve_Aik(t...))
optimize!(m)

solution = [value.(t[i]) for i=1:N]

, последняя строка которого дает мне мое решение просто отлично.

Однако, как только я поместил это в al oop (даже не указав номер, который я зацикливался на проблеме), я больше не могу восстановить свое решение с ошибкой "MethodError: нет значения, соответствующего методу (:: ForwardDiff.Dual {ForwardDiff.Tag {JuMP.var "# 107 # 109" {var "# solve_Aik # 378"}, Float64}, Float64,8}) ". См. Код ниже:

nums = [1,2,3]
for num in nums
    m = Model(Ipopt.Optimizer)
    @variable(m, t[1:N] >= 0.00000001)


    function solve_Aik(tlist...)                            
        t = collect(tlist)
        return sum([t[i]^2 for i in 1:N])
    end

    register(m, :solve_Aik, N, solve_Aik, autodiff=true)
    @NLobjective(m, Min, solve_Aik(t...))
    optimize!(m)

    solution = [value.(t[i]) for i=1:N]
end

Последняя строка, предлагающая решение, - это то, на что Джулия зацикливается. Кто-нибудь еще сталкивался с подобной проблемой? ТИА!

1 Ответ

1 голос
/ 04 марта 2020

Мое предположение, основанное на сообщении об ошибке, заключается в том, что по какой-то причуде правил определения области действия Джулии t = collect(tlist) перезаписывает переменную JuMP t, определенную в теле для l oop. Попробуйте использовать другое имя для переменной внутри solve_Aik.

...