主要内容

六种求解器的比较

优化功能

这个例子展示了如何用六个解算器最小化Rastrigin函数。每个求解器都有自己的特点。这些特性导致了不同的解决方案和运行时间。万博 尤文图斯考试的结果可以帮助你为自己的问题选择一个合适的解决方案。

Rastrigin函数有许多局部最小值,在(0,0)处有一个全局最小值。函数定义为 R 一个 年代 xgydF4y2Ba

R 一个 年代 xgydF4y2Ba 2 0 + xgydF4y2Ba 1 2 + xgydF4y2Ba 2 2 - 1 0 因为 2 π xgydF4y2Ba 1 + 因为 2 π xgydF4y2Ba 2

rastriginsfcn.m在运行此示例时,可以使用该文件,该文件计算Rastrigin函数的值。这个例子使用了拉斯特里金函数的缩放版本,有更大的吸引力盆地。有关信息,请参见吸引盆地.创建缩放函数的曲面图。

Rf2 = @(x)rastriginsfcn(x/10);rf3 = @ (x, y)重塑(rastriginsfcn ([x (:) / 10, y(:) / 10]),大小(x));fsurf (rf3 30 [-30],“ShowContours”“上”)标题(“rastriginsfcn ([10 x / y / 10])”)包含(“x”) ylabel (“y”

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

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

这个例子最小化了rf2的默认设置fminunc(一个优化工具箱™求解器),patternsearch,GlobalSearch.该示例还使用了遗传算法而且particleswarm使用非默认选项从该点周围的初始填充开始(20、30).因为surrogateopt需要有限的边界,示例使用surrogateopt每个变量的下界为-70,上界为130。

六种解决方法

fminunc

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

Rf2 = @(x)rastriginsfcn(x/10);%的目标X0 = [20,30];%远离最小值的起始点[xf,ff,flf,of] = fminunc(rf2,x0)
找到局部极小值。优化完成,因为梯度的大小小于最优性公差的值。
xf =1×219.8991 - 29.8486
Ff = 12.9344
FLF = 1
的=带字段的结构:迭代:3 funcCount: 15步长:1.7776e-06 lssteplth: 1 firstorderopt: 5.9907e-09算法:'准牛顿'消息:'本地最小值发现....'
  • xf是最小值点。

  • ff是目标的价值,rf2,在xf

  • flf是退出标志。退出标志为1表示xf是局部极小值。

  • 是输出结构,其中描述了fminunc计算得到解。

patternsearch

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

Rf2 = @(x)rastriginsfcn(x/10);%的目标X0 = [20,30];%远离最小值的起始点[xp,fp,flp,op] = patternsearch(rf2,x0)
优化终止:网格尺寸小于options.MeshTolerance。
xp =1×219.8991 - -9.9496
Fp = 4.9748
FLP = 1
op =带字段的结构:function: @(x)rastriginsfcn(x/10) problemtype: 'unconstrained' pollmethod: 'gpspositivebasis2n' maxconstraint: [] searchmethod: [] iterations: 48 funccount: 174 meshsize: 9.5367e-07 rngstate: [1x1 struct] message: '优化终止:网格尺寸小于选项. meshtolerance .'
  • xp是最小值点。

  • 《外交政策》是目标的价值,rf2,在xp

  • 隔爆是退出标志。退出标志为1表示xp是局部极小值。

  • 人事处是输出结构,其中描述了patternsearch计算得到解。

遗传算法

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

rng默认的再现率%Rf2 = @(x)rastriginsfcn(x/10);%的目标X0 = [20,30];%远离最小值的起始点Initpop = 10*randn(20,2) + repmat(x0,20,1);Opts = optimoptions(“遗传算法”“InitialPopulationMatrix”, initpop);
  • initpop是一个20 × 2矩阵。每行initpop也意味着(20、30),各元素正态分布,标准差为10。的初始填充矩阵遗传算法解算器。

  • 选择是设置的选项吗initpop作为初始人口。

  • Ga使用随机数,产生随机结果。

  • 下一行调用遗传算法,使用选项。

(xga fga、flga简称oga] = ga (rf2 2 ,[],[],[],[],[],[],[], 选择)
优化终止:超过最大代数。
xga =1×2-0.0042 - -0.0024
Fga = 4.7054e-05
Flga = 0
简称oga =带字段的结构:问题类型:'unconstrained' rngstate: [1x1 struct] generations: 200 funccount: 9453 message: '优化终止:超过最大代数。' maxconstraint: [] hybridflag: []
  • xga是最小值点。

  • fga是目标的价值,rf2,在xga

  • flga是退出标志。退出标志为0表示这一点遗传算法达到函数求值极限或迭代极限。在这种情况下,遗传算法达到迭代限制。

  • 简称oga是输出结构,其中描述了遗传算法计算得到解。

particleswarm

就像遗传算法particleswarm是一个基于种群的算法。因此,为了公平比较求解器,初始化粒子群为相同的种群遗传算法

rng默认的再现率%Rf2 = @(x)rastriginsfcn(x/10);%的目标Opts = optimoptions(“particleswarm”“InitialSwarmMatrix”, initpop);[xpso,fpso,flgpso,opso] = particleswarm(rf2,2,[],[],opts)
优化结束:目标值相对于上一个OPTIONS发生了变化。MaxStallIterations的迭代小于OPTIONS.FunctionTolerance。
xpso =1×29.9496 - 0.0000
Fpso = 0.9950
Flgpso = 1
opso =带字段的结构:rngstate: [1x1 struct] iterations: 56 funccount: 1140 message: '优化结束:客观值的相对变化…' hybridflag: []

surrogateopt

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

rng默认的再现率%Lb = [-70,-70];Ub = [130,130];Rf2 = @(x)rastriginsfcn(x/10);%的目标Opts = optimoptions(“surrogateopt”“PlotFcn”[]);[xsur,fsur,flgsur,osur] = surrogateopt(rf2,lb,ub,opts)
surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。
xsur =1×2-1.3383 - -0.3022
Fsur = 3.5305
Flgsur = 0
osur =带字段的结构:Elapsedtime: 2.9825 funccount: 200 constrviolation: 0 ineq: [1x0 double] rngstate: [1x1 struct] message: 'surrogateopt停止,因为它超过了函数计算限制…'
  • xsur是最小值点。

  • fsur是目标的价值,rf2,在xsur

  • flgsur是退出标志。退出标志为0表示这一点surrogateopt停止,因为耗尽了函数计算或时间。

  • osur是输出结构,其中描述了surrogateopt计算得到解。

GlobalSearch

来解决优化问题GlobalSearch解算器,输入:

Rf2 = @(x)rastriginsfcn(x/10);%的目标X0 = [20,30];%远离最小值的起始点问题= createOptimProblem(“fmincon”“目标”rf2,...“x0”, x0);gs = GlobalSearch;

问题是一个优化问题结构。问题指定了fmincon解算器,rf2目标函数,和x0 =(20、30).有关使用的更多信息createOptimProblem,请参阅创建问题结构

请注意:必须指定fmincon作为求解器GlobalSearch,即使对无约束问题也是如此。

gs为默认值。GlobalSearch对象。对象包含解决问题的选项。调用运行(gs、问题)从多个起点运行问题。起点是随机的,所以接下来的结果也是随机的。

[xg,fg,flg,og] = run(gs,problem)
GlobalSearch停止了,因为它分析了所有的试验点。所有6个本地求解器运行都收敛于一个积极的本地求解器退出标志。
xg =1×2107× -0.1405 -0.1405
Fg = 0
FLG = 1
og =带字段的结构:funcCount: 2157 localSolverTotal: 6 localSolverSuccess: 6 localSolverIncomplete: 0 localSolverNoSolution: 0消息:'GlobalSearch停止,因为它分析了所有的试验点....'
  • xg是最小值点。

  • 成品是目标的价值,rf2,在xg

  • 焦距是退出标志。退出标志为1表示全部退出fmincon运行收敛正确。

  • 是输出结构,其中描述了GlobalSearch计算得到解。

比较语法和解决方案万博 尤文图斯

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

Sols = [xf;xp;xga;xpso;xsur;xg];Fvals = [ff;《外交政策》;fga;单点; fsur; fg]; fevals = [of.funcCount; op.funccount; oga.funccount; opso.funccount; osur.funccount; og.funcCount]; stats = table(sols,fvals,fevals); stats.Properties.RowNames = [“fminunc”“patternsearch”“遗传算法”“particleswarm”“surrogateopt”“GlobalSearch”];stats.Properties.VariableNames = [“解决方案”“客观”“#函数宏指令”];disp(统计)
解决方案目标# Fevals __________________________ __________________ fminunc 19.899 29.849 12.934 15 patternsearch 19.899 -9.9496 4.9748 174 ga -0.0042178 -0.0024347 4.7054e-05 9453 particleswarm 9.9496 6.75e-07 0.99496 1140 surrogateopt -1.3383 -0.30217 3.5305 200 GlobalSearch -1.4046e-08 -1.4046e-08 0 2157

这些结果是典型的:

  • fminunc快速到达起始盆地内的局部解,但根本不探索盆地外的解。fminunc具有简单的调用语法。

  • patternsearch进行比fminunc更多的函数评估,并在多个盆地中搜索,得到比fminunc更好的解决方案fminunc.的patternsearch调用语法与的相同fminunc

  • 遗传算法需要比模式搜索更多的函数计算。它偶然得到了一个更好的解决方案。在这种情况下,遗传算法在全局最优值附近找到一个点。遗传算法是随机的,所以它的结果随每次运行而变化。遗传算法有一个简单的调用语法,但有额外的步骤有一个初始人口附近(20、30)

  • particleswarm较少的函数求值遗传算法,但不仅仅是patternsearch.在这种情况下,particleswarm找到目标函数值较低的点patternsearch,但高于遗传算法.因为particleswarm是随机的,它的结果随每次运行而变化。particleswarm有一个简单的调用语法,但有额外的步骤有一个初始人口附近(20、30)

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

  • GlobalSearch运行取相同数量级的函数求值遗传算法而且particleswarm他搜索了许多盆地,得出了一个很好的解决方案。在这种情况下,GlobalSearch找到全局最优值。设置GlobalSearch比其他求解器要复杂得多。如示例所示,在调用之前GlobalSearch时,必须同时创建一个GlobalSearch对象(gs在本例中),以及一个问题结构(问题).然后,你调用运行方法gs而且问题.有关如何运行的详细信息GlobalSearch,请参阅GlobalSearch和MultiStart的工作流

另请参阅

|||||

相关的话题