从Julia函数调用局部变量(优化)



我正在处理Julia 1.7.3中的嵌套优化问题。特别是,我需要优化一个函数(比如f1),而这个函数又依赖于另一个函数(比如f2)的优化结果。下面是一个简单的例子来说明我的问题

using Optim
function f2(x::Float64, y::Float64) 
return (x^2 - x - y)^2
end
function f1(y::Float64) 
x₁ = optimize(x -> f2(x,y), -10, 10).minimizer
return (y*x₁ - 0.5)^2
end

为了得到f1的优化器,我执行

y₁ = optimize(y -> f1(y), -10, 10).minimizer

为了得到f2的优化器,我执行

x₁ = optimize(x -> f2(x,y₁), -10, 10).minimizer
然而,最后一步似乎非常低效,因为它需要额外的优化调用。在优化f1(即x₁)时,f2的优化器确实已经计算过了。是否有一种方法可以检索x₁而无需额外的优化步骤(例如,在f1的最后迭代步骤中保存x₁

)?注意:一种选择是将两个优化问题合并,同时针对xy对目标函数进行优化。但是,我不能在我正在处理的实际应用程序中使用这种方法。

您可以将x₁存储在可变结构体中,例如

using Optim
mutable struct Minimizer{T}
x::T
y::T
end
function f2(x::Float64, y::Float64)
return (x^2 - x - y)^2
end
function f1!(m::Minimizer, y::Float64)
x₁ = optimize(x -> f2(x,y), -10, 10).minimizer
m.x = x₁
return (y*x₁ - 0.5)^2
end
M = Minimizer(NaN, NaN)
M.y = optimize(y -> f1!(M, y), -10, 10).minimizer
@show M
# M = Minimizer{Float64}(1.2971565074975993, 0.3854585027525779)

最新更新