主要内容

比较几种基于问题的全局求解器

这个例子展示了如何用几种求解器最小化Rastrigin函数。每个求解器都有自己的特点。这些特性导致了不同的解决方案和运行时间。研究结果总结在比较求解器和解,可以帮助您为自己的问题选择合适的解决方案。

Rastrigin函数有许多局部极小值,在(0,0)处有一个全局极小值:

ras = @ (x, y) 20 + x ^ 2 + y ^ 2 - 10 * (cos(2 *π* x) + cos(2 *π* y));

画出每个方向乘以10的函数。

Rf3 = @(x, y) ras(x/10, y/10);fsurf (rf3 30 [-30],“ShowContours”“上”)标题(“rastriginsfcn ([10 x / y / 10])”)包含(“x”) ylabel (“y”

图中包含一个axes对象。标题为rastriginsfcn([x/10,y/10])的axes对象包含一个functionsurface类型的对象。

通常你不知道目标函数的全局最小值的位置。为了说明求解器如何寻找全局解,本示例在点[20,30]附近启动所有求解器,该点离全局最小值很远。

fminunc解算器

使用默认值解决优化问题fminunc优化工具箱™求解器,输入:

x = optimvar (“x”);y = optimvar (“y”);概率= optimproblem (“客观”rf3 (x, y));x0。x = 20;x0。y = 30;林洋新能源,fvalf、eflagf outputf] =解决(x0概率)
使用fminunc解决问题。局部最小值。由于梯度的大小小于最优公差值,因此优化已完成。
林洋新能源=结构体字段:X: 19.8991 y: 29.8486
fvalf = 12.9344
eflagf = OptimalSolution
outputf =结构体字段:迭代:3 funcCount: 5 stepsize: 1.7773e-06 lssteplth: 1 firstorderopt: 2.0461e-09算法:'准牛顿'消息:'局部最小值发现....' objectivederivative: "reverse-AD" solver: 'fminunc'

fminunc在很少的函数求值中解决问题(只有5个,如outputf结构),并在起点附近达到局部最小值。exit标志表示解决方案是本地最小值。

patternsearch解算器

来解决优化问题patternsearch全局优化工具箱求解器,输入:

x0。x = 20;x0。y = 30;[solp, fvalp eflagp outputp] =解决(x0,概率“规划求解”“patternsearch”
使用模式搜索解决问题。优化终止:网格尺寸小于options.MeshTolerance。
solp =结构体字段:X: 19.8991 y: -9.9496
fvalp = 4.9748
eflagp = SolverConvergedSuccessfully
outputp =结构体字段:函数:@(x)fun(x,extraParams) problemtype: 'unconstrained' pollmethod: 'gpspositivebasis2n' maxconstraint: [] searchmethod: [] iterations: 48 funccount: 174 meshsize: 9.5367e-07 rngstate: [1x1 struct] message: '优化终止:网格尺寸小于options.MeshTolerance。“解决者:“patternsearch”

就像fminuncpatternsearch达到局部最优值,如退出标志所示exitflagp.解决方案比fminunc解,因为它的目标函数值较低。然而,patternsearch接受更多的函数求值,如输出结构所示。

遗传算法解算器

来解决优化问题遗传算法全局优化工具箱求解器,输入:

rng默认的%的再现性x0。X = 10*randn(20) + 20;x0。Y = 10*randn(20) + 30;%[20,30]附近的随机开始种群;[solg, fvalg eflagg outputg] =解决(概率,“规划求解”“遗传算法”
用遗传算法求解问题。优化终止:超过最大代数。
solg =结构体字段:X: 0.0064 y: 7.7057e-04
fvalg = 8.1608 e-05
eflagg = SolverLimitExceeded
outputg =结构体字段:问题类型:'unconstrained' rngstate: [1x1 struct] generations: 200 funccount: 9453 message: '优化终止:超过最大代数。' maxconstraint: [] hybridflag: [] solver: 'ga'

遗传算法与以前的求解器相比,需要进行更多的函数计算,并得到一个接近全局最小值的解。该求解器是随机的,可以达到次优解。

particleswarm解算器

来解决优化问题particleswarm全局优化工具箱求解器,输入:

rng默认的%的再现性[solpso, fvalpso eflagpso outputpso] =解决(概率,“规划求解”“particleswarm”
使用particleswarm解决问题。优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
solpso =结构体字段:X: 7.1467e-07 y: 1.4113e-06
fvalpso = 4.9631 e-12
eflagpso = SolverConvergedSuccessfully
outputpso =结构体字段:rngstate: [1x1 struct] iterations: 120 funccount: 2420 message: '优化结束:目标值的相对变化…' mixdflag: [] solver: 'particleswarm'

求解器需要较少的函数求值遗传算法,并得到了一个更精确的解。同样,求解器是随机的,可能无法得到全局解。

simulannealbnd解算器

来解决优化问题simulannealbnd全局优化工具箱求解器,输入:

rng默认的%的再现性x0。x = 20;x0。y = 30;[solsim, fvalsim eflagsim outputsim] =解决(x0,概率“规划求解”“simulannealbnd”
用simulannealbnd解决问题。优化终止:最佳函数值的变化小于options.FunctionTolerance。
solsim =结构体字段:X: 0.0025 y: 0.0018
fvalsim = 1.8311 e-05
eflagsim = SolverConvergedSuccessfully
outputsim =结构体字段:消息:“优化终止:最佳函数值的变化小于options.FunctionTolerance。”' rngstate: [1x1 struct] problemtype: 'unconstrained' temperature: [2x1 double] totaltime: 2.1971 solver: 'simulannealbnd'

求解器的函数求值次数与particleswarm,并得到一个很好的解决方案。这个求解器也是随机的。

surrogateopt解算器

surrogateopt不需要起点,但需要有限的边界。在每个组件中设置-70到130的界限。要获得与其他求解器相同的输出类型,请禁用默认的绘图功能。

rng默认的%的再现性x = optimvar (“x”“下界”, -70,“UpperBound”, 130);y = optimvar (“y”“下界”, -70,“UpperBound”, 130);概率= optimproblem (“客观”rf3 (x, y));选择= optimoptions (“surrogateopt”“PlotFcn”[]);[solsur, fvalsur eflagsur outputsur] =解决(概率,...“规划求解”“surrogateopt”...“选项”选项)
使用surrogateopt解决问题。surrogateopt停止,因为它超过了'options. maxfunctionevaluments '设置的函数求值限制。
solsur =结构体字段:X: -1.3383 y: -0.3022
fvalsur = 3.5305
eflagsur = SolverLimitExceeded
outputsur =结构体字段:Elapsedtime: 7.9723 funccount: 200 constrviolation: 0 ineq: [1x1 struct] rngstate: [1x1 struct] message: 'surrogateopt停止,因为它超过了由…“解决者:“surrogateopt”

该求解器只需相对较少的函数求值就能得到接近全局最优的解。然而,每个函数的求值比其他求解器花费更多的时间。

比较求解器和解

如果一个解的目标函数值小于另一个解,则该解优于另一个解。下表总结了结果。

溶胶=[林洋新能源。x solf.y;solp。x solp.y;solg。x solg.y;solpso。x solpso.y;solsim。x solsim.y;solsur。x solsur.y]; fvals = [fvalf; fvalp; fvalg; fvalpso; fvalsim; fvalsur]; fevals = [outputf.funcCount; outputp.funccount; outputg.funccount; outputpso.funccount; outputsim.funccount; outputsur.funccount]; stats = table(sols,fvals,fevals); stats.Properties.RowNames = [“fminunc”“patternsearch”“遗传算法”“particleswarm”“simulannealbnd”“surrogateopt”];stats.Properties.VariableNames = [“解决方案”“客观”“#函数宏指令”];disp(统计)
解决目标# Fevals ________________________ __________________ fminunc 19.899 29.849 12.934 5 patternsearch 19.899 -9.9496 4.9748 174 ga 0.0063672 0.00077057 8.1608e-05 9453 particleswarm 7.1467e-07 1.4113e-06 4.9631e-12 2420 simulannealbnd 0.002453 0.0017923 1.8311e-05 1986 surrogateopt -1.3383 -0.30217 3.5305 200

这些结果是典型的:

  • fminunc快速到达其起始盆地内的局部解,但根本不探索该盆地外。因为目标函数有解析导数,fminunc使用自动微分和很少的函数求值来达到精确的局部极小值。

  • patternsearch需要更多的函数求值fminunc,并在几个盆地中寻找,得到了比fminunc

  • 遗传算法需要更多的函数求值patternsearch.偶然地,它会得到一个更好的解决方案。在这种情况下,遗传算法找到一个接近全局最优的点。遗传算法是随机的,所以它的结果随每次运行而变化。遗传算法需要额外的步骤使初始种群接近[20,30]。

  • particleswarm需要较少的函数求值遗传算法,但不仅仅是patternsearch.在这种情况下,particleswarm找到一个目标函数值较低的点patternsearch遗传算法.因为particleswarm是随机的,它的结果随每次运行而变化。particleswarm需要额外的步骤使初始种群接近[20,30]。

  • simulannealbnd函数求值的次数和particleswarm.在这种情况下,simulannealbnd找到了一个很好的解决方案,但不如particleswarm.该求解器是随机的,可以得到次优解。

  • surrogateopt当达到函数计算极限时停止,对于两个变量的问题,该极限默认为200。surrogateopt需要有限的范围。surrogateopt试图找到一个全球性的解决方案,在这种情况下成功了。中的每个函数求值surrogateopt比其他解法要花更长的时间,因为surrogateopt执行许多辅助计算作为其算法的一部分。

另请参阅

|||||

相关的话题

Baidu
map