JuMP 查询解决方案在 for 循环中不起作用



我正在将JuMP v0.20.0与Ipopt优化器一起使用,我正试图在循环中求解一个非线性方程组,其中问题语句根据我循环的内容而变化。

假设我有一个非常简单的问题,试图选择$$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]

最后一行为我提供了一个很好的解决方案。

然而,一旦我将其放入循环中(甚至没有提供我循环到该问题的数字(,我就无法再恢复我的解决方案,错误为"MethodError:no method matching value(::ForwardDiff.DDual{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

提供解决方案的最后一行是Julia挂断的电话。其他人遇到过类似的问题吗?TIA!

根据错误消息,我的猜测是,由于Julia的作用域规则有些古怪,t = collect(tlist)覆盖了在for循环主体中定义的JuMP变量t。请尝试为solve_Aik中的变量使用其他名称。

最新更新