主要内容

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

这个例子展示了如何用几个解算器最小化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”

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

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

fminunc解算器

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

X = optimvar(“x”);Y = optimvar(“y”);问题=优化问题(“客观”rf3 (x, y));x0。X = 20;x0。Y = 30;[solf,fvalf,eflagf, outf] = solve(prob,x0)
使用fminunc解决问题。找到局部极小值。优化完成,因为梯度的大小小于最优性公差的值。
林洋新能源=带字段的结构:X: 19.8991 y: 29.8486
Fvalf = 12.9344
eflagf = OptimalSolution
outputf =带字段的结构:迭代:3 funcCount: 5步长:1.7773e-06 lssteplth: 1 firstorderopt: 2.0461e-09算法:'准牛顿'消息:'本地最小值找到....' objecvederivative: ' reverse-AD '求解器:'fminunc'

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

patternsearch解算器

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

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

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

遗传算法解算器

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

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

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

particleswarm解算器

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

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

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

simulannealbnd解算器

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

rng默认的%用于再现性x0。X = 20;x0。Y = 30;[solsim,fvalsim,eflagsim,outputsim] = solve(prob,x0,“规划求解”“simulannealbnd”
用simulannealnd求解问题。优化终止:最佳函数值的更改小于options.FunctionTolerance。
solsim =带字段的结构:X: 0.0025 y: 0.0018
Fvalsim = 1.8386e-05
eflagsim = SolverConvergedSuccessfully
outputsim =带字段的结构:消息:“优化终止:最佳函数值的更改小于options.FunctionTolerance。”' rngstate: [1x1 struct] problemtype: 'unconstrained' temperature: [2x1 double] totaltime: 0.8423

求解器需要相同数量的函数求值particleswarm,并得到很好的解决方案。这个求解器也是随机的。

surrogateopt解算器

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

rng默认的%用于再现性X = optimvar(“x”“下界”, -70,“UpperBound”, 130);Y = optimvar(“y”“下界”, -70,“UpperBound”, 130);问题=优化问题(“客观”rf3 (x, y));选项= optimoptions(“surrogateopt”“PlotFcn”[]);[solsur,fvalsur, egflagsur,outputsur] = solve(问题,...“规划求解”“surrogateopt”...“选项”选项)
使用代理解决问题。surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。
solsur =带字段的结构:X: -1.3383 y: -0.3022
Fvalsur = 3.5305
eflagsur = SolverLimitExceeded
outputsur =带字段的结构:Elapsedtime: 3.5725 funccount: 200 constrviolation: 0 ineq: [1x1 struct] rngstate: [1x1 struct] message: 'surrogateopt停止,因为它超过了函数计算限制…'surrogateopt'

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

比较求解器和解决方案万博 尤文图斯

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

Sols = [solf.]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.0018028 1.8386e-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执行许多辅助计算作为其算法的一部分。

另请参阅

|||||

相关的话题