使用Optim.jl求解区间函数最小值得到错误结果如何解决
问题原因分析
你使用的GoldenSection以及Optim.jl默认的单变量优化算法都属于局部优化算法,核心假设是搜索区间内的目标函数为单峰函数,仅能保证收敛到搜索路径上遇到的第一个局部极小值。你给出的目标函数在[1.75, 3.5]区间内存在多个局部极小点,因此算法会收敛到错误的局部最优解,而非全局最小值。
解决方案
方案1:粗扫描定位后局部优化(Optim.jl原生实现)
先通过粗粒度的区间扫描定位全局极小值所在的子区间,再在子区间(该区间内函数为单峰)运行局部优化算法即可得到正确结果,示例代码如下:
using Optim f(x)= -abs(1-x/3.5+(2*sin(2*pi*(x-1.75))-sin(2*pi*x))/(7*pi)) # 第一步:粗扫描区间,定位全局极小的近似位置 scan_x = range(1.75, 3.5, length=1000) scan_y = f.(scan_x) approx_min_x = scan_x[argmin(scan_y)] # 划定全局极小所在的单峰子区间 sub_lower = approx_min_x - 0.1 sub_upper = approx_min_x + 0.1 # 第二步:在子区间内运行黄金分割法优化 res = optimize(f, sub_lower, sub_upper, GoldenSection()) # 输出结果 println(Optim.minimizer(res)) # 输出约1.8524 println(Optim.minimum(res)) # 输出约-0.5617
方案2:使用全局优化工具包
如果需要处理大量类似多峰优化问题,可以搭配支持全局优化的Julia工具包使用,无需手动扫描区间。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

