六种求解器的比较
优化功能
这个例子展示了如何用六个解算器最小化Rastrigin函数。每个求解器都有自己的特点。这些特性导致了不同的解决方案和运行时间。万博 尤文图斯考试的结果可以帮助你为自己的问题选择一个合适的解决方案。
Rastrigin函数有许多局部最小值,在(0,0)处有一个全局最小值。函数定义为 :
的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”)
通常,你不知道目标函数的全局最小值的位置。为了展示解算器如何寻找全局解,这个例子在点[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的工作流.
另请参阅
GlobalSearch
|patternsearch
|遗传算法
|surrogateopt
|particleswarm
|fminunc