JuMP 查询解决方案在 for 循环中不起作用
JuMP querying solution doesn't work in for loop
我将 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.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
提供解决方案的最后一行是 Julia 挂断的地方。还有其他人遇到过类似的问题吗? TIA!
我根据错误消息的猜测是,由于 Julia 的范围规则的一些怪癖,t = collect(tlist)
覆盖了 for 循环主体中定义的 JuMP 变量 t
。尝试为 solve_Aik
.
中的变量使用不同的名称
我将 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.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
提供解决方案的最后一行是 Julia 挂断的地方。还有其他人遇到过类似的问题吗? TIA!
我根据错误消息的猜测是,由于 Julia 的范围规则的一些怪癖,t = collect(tlist)
覆盖了 for 循环主体中定义的 JuMP 变量 t
。尝试为 solve_Aik
.