六种求解器的比较
优化函数
这个例子展示了如何用六个求解器最小化Rastrigin函数。每个求解器都有自己的特点。这些特性导致了不同的解决方案和运行时间。检查的结果可以帮助您为自己的问题选择合适的解决方案。
Rastrigin函数有许多局部极小值,其中在(0,0)处有一个全局极小值。函数定义为 :
的rastriginsfcn.m
文件,该文件计算Rastrigin函数的值,在运行此示例时可用。这个例子使用了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 stepsize: 1.7776e-06 lsstelength: 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 =带有字段的结构:函数:@(x)rastriginsfcn(x/10) problemtype: 'unconstrained' pollmethod: 'gpspositivebasis2n' maxconstraint: [] searchmethod: [] iterations: 48 funccount: 174 meshsize: 9.5367e-07 rngstate: [1x1 struct] message: '优化终止:meshsize小于options.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的行形成了一个初始填充矩阵遗传算法
解算器。选择
是设置的选项吗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);[xgpso,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. maxfunctionevaluments '设置的函数求值限制。
xsur =1×2-1.3383 - -0.3022
Fsur = 3.5305
Flgsur = 0
osur =带有字段的结构:Elapsedtime: 7.2899 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] =运行(gs,问题)
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 stopped because it analysisall trial points....'
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