Julia嵌套优化:如何避免重复计算获取已求得的f2最优解
解决嵌套优化中的重复计算问题
要避免重复计算对应最优y₁的x₁,核心思路是在计算外层目标函数f1的过程中,缓存每个y值对应的内层优化结果x₁,当外层找到最优y₁后,直接从缓存中读取对应的x₁即可。
以下是具体实现方案:
方案1:使用闭包封装缓存(推荐)
这种方式避免全局变量,更符合Julia的模块化编程习惯:
using Optim function build_nested_optim_functions() # 内部缓存字典,存储y到对应最优x的映射 x_cache = Dict{Float64, Float64}() # 内层目标函数f2 function f2(x::Float64, y::Float64) return (x^2 - x - y)^2 end # 外层目标函数f1,同时缓存x结果 function f1(y::Float64) inner_res = optimize(x -> f2(x, y), -10, 10) x_opt = inner_res.minimizer # 将当前y对应的最优x存入缓存 x_cache[y] = x_opt return (y * x_opt - 0.5)^2 end # 返回外层函数和缓存对象 return f1, x_cache end # 获取f1和对应的缓存 f1, x_cache = build_nested_optim_functions() # 执行外层优化 empty!(x_cache) # 清空缓存避免残留数据 outer_res = optimize(f1, -10, 10) y_opt = outer_res.minimizer # 直接从缓存读取对应y_opt的x_opt,无需重复优化 x_opt = x_cache[y_opt]
方案2:使用全局缓存字典
如果不需要模块化,也可以直接用全局字典缓存:
using Optim # 全局缓存字典 x_cache = Dict{Float64, Float64}() function f2(x::Float64, y::Float64) return (x^2 - x - y)^2 end function f1(y::Float64) inner_res = optimize(x -> f2(x, y), -10, 10) x_opt = inner_res.minimizer x_cache[y] = x_opt return (y * x_opt - 0.5)^2 end # 执行外层优化 empty!(x_cache) outer_res = optimize(y -> f1(y), -10, 10) y_opt = outer_res.minimizer # 直接读取缓存中的x_opt x_opt = x_cache[y_opt]
注意事项
- 外层优化算法(如默认的Brent方法)在寻找最优解时,必然会评估
f1(y_opt),因此y_opt对应的x_opt一定会被存入缓存,无需担心缺失。 - 如果使用全局缓存,每次运行外层优化前建议调用
empty!(x_cache)清空缓存,避免之前的计算残留影响结果。
内容的提问来源于stack exchange,提问作者Fabrizio Leone
相关产品推荐
相关产品推荐

