主要内容

六种求解器的比较

优化函数

这个例子展示了如何用六个求解器最小化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函数的值,在运行此示例时可用。这个例子使用了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”

图中包含一个axes对象。标题为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 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的工作流程

另请参阅

|||||

相关的话题

Baidu
map