我正在处理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₁
)?注意:一种选择是将两个优化问题合并,同时针对x
和y
对目标函数进行优化。但是,我不能在我正在处理的实际应用程序中使用这种方法。
您可以将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)