主要内容

调优粒子群优化过程

此示例显示了如何优化使用particleswarm解算器。粒子群算法将一群粒子种群移动到目标函数的最小值。群中每个粒子的速度根据三个因素变化:

  • 惯性的影响(InertiaRange选项)

  • 吸引粒子到达的最佳位置(selfadjustment重量选项)

  • 邻近粒子中最好的位置的吸引力(社交调节重量选项)

此示例显示了更改粒子群选项的一些效果。

何时修改选项

通常,particleswarm使用其默认选项时会找到一个好的解决方案。例如,它优化rastriginsfcn使用默认选项。这个函数有许多局部极小值,和一个全局极小值0在点[0,0]

rng默认的%的再现性[x, fval exitflag、输出]= particleswarm (@rastriginsfcn 2);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
formatstring =.'particleSwarm使用%d函数评估达到值%f。\ n';流(formatstring fval output.funccount)
使用2560函数评估,ParticleSwarm达到0.000000。

对于这个函数,你知道最优目标值,所以你知道解算器找到了它。但是如果你不知道解决方案呢?评估解决方案质量的一种方法是重新运行求解器。

[x, fval exitflag、输出]= particleswarm (@rastriginsfcn 2);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
流(formatstring fval output.funccount)
通过1480次函数评估,粒子温值达到了0.000000。

解决方案和函数求值的数量都与上次运行类似。这表明求解器在得到解决方案时没有困难。

使用默认参数难以实现的客观函数

众所周知,罗森布罗克函数是一个很难优化的函数。本例使用了Rosenbrock函数的多维版本。函数的最小值为0在点[1,1,1,......]

rng默认的%的再现性据nvar = 6;%选择NVAR的任何偶数值有趣= @multirosenbrock;[x, fval exitflag、输出]= particleswarm(有趣,据nvar);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
流(formatstring fval output.funccount)
ParticleSwarm使用12960功能评估达到了价值3106.436648。

求解者没有找到一个很好的解。

绑定了搜索空间

尝试限定空间以帮助求解器定位好点。

磅= -10 * 1(1,据nvar);乌兰巴托=磅;[xbounded, fvalbounded exitflagbounded outputbounded] = particleswarm(磅,有趣,据nvar乌兰巴托);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
流(formatstring fvalbounded outputbounded.funccount)
通过71160次函数评估,粒子暖度达到了0.000006。

求解器找到了更好的解决方案。但它需要很多功能评估。

改变选项

也许求解器将更快地收敛,如果它更加注重整个空间中最好的邻居,而不是一些较小的社区。

选项= Optimoptions(“particleswarm”“MinNeighborsFraction”1);[xn, fvaln exitflagn outputn] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
fprintf(FormatString,Fvaln,Outputn.Funccount)
使用30180函数评估,ParticleSwarm达到0.000462。

虽然求解器需要更少的函数计算,但尚不清楚这是由于随机性还是更好的选项设置。

也许你应该提高selfadjustment重量选项。

选项。SelfAdjustmentWeight = 1.9;[xn2, fvaln2 exitflagn2 outputn2] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
流(formatstring fvaln2 outputn2.funccount)
通过18780次函数评估,粒子暖度达到了0.000074。

这一次particleswarm更少的函数计算。这种改进是由于随机性,还是选项设置真的值得?重新运行求解器并查看函数计算的次数。

[XN3,FVALN3,EXITFLAGN3,OUTPORN3] = ParticleSwarm(有趣,NVARS,LB,UB,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
流(formatstring fvaln3 outputn3.funccount)
使用53040功能评估,粒子达到0.157026。

这次功能评估的数量增加。显然,这一点selfadjustment重量设置不一定提高性能。

提供初始点

可能particleswarm如果它从一个不太远离解决方案的已知点开始做得更好。尝试起源。在同一初始点给一些人。他们的随机速度确保它们不会保持在一起。

x0 =零(20,6);%将20个个人设置为行向量options.initialswarmmatrix = x0;剩余的蜂群是随机的[XN3,FVALN3,EXITFLAGN3,OUTPORN3] = ParticleSwarm(有趣,NVARS,LB,UB,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
流(formatstring fvaln3 outputn3.funccount)
通过32100函数评估,粒子温暖值达到了0.039015。

函数评估的数量再次下降。

Vectorize速度

multirosenbrock函数允许向量化函数求值。这意味着它可以同时对群中所有粒子的目标函数进行评估。这通常会大大加快求解器的速度。

rng默认的%进行公平比较options.usevectorized = true;TIC [XV,FVALV,EXITFLAGV,OUTPUTV] = PIMICLESWARM(FUN,NVARS,LB,UB,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
TOC.
经过时间为0.235804秒。
选项。UseVectorized = false;rng默认的TIC [XNV,FVALNV,EXITFLAGNV,OUTPORNV] = PIMICLESSWARM(FUN,NVARS,LB,UB,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
TOC.
运行时间为0.560248秒。

向量化计算的时间大约是串行计算的一半。

绘图功能

您可以使用绘图函数查看求解器的进度。

选择= optimoptions(选项,'plotfcn', @pswplotbestf);rng默认的[x, fval exitflag、输出]= particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。

图粒子包含一个轴。标题最佳功能值的轴:0.0797555包含类型线的对象。

流(formatstring fval output.funccount)
使用24960功能评估,ParticleSwarm达到0.079755。

使用更多的粒子

通常,使用更多粒子获得更准确的解决方案。

rng默认的options.swarmsize = 200;[x, fval exitflag、输出]= particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。

图粒子包含一个轴。标题为“最佳功能值:0.000424241”的轴包含一个线型对象。

流(formatstring fval output.funccount)
粒子温值达到0.000424使用169400函数评估。

混合函数

particleswarm可以通过几个吸引力盆地搜索到达一个良好的本地解决方案。但有时,它没有足够准确的局部最低限度。尝试通过指定在粒子群算法停止后运行的混合函数来提高最终答案。将粒子数重置为原始值,60,查看混合函数的差异。

rng默认的options.hybridfcn = @fmincon;options.swarmsize = 60;[x, fval exitflag、输出]= particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。

图粒子包含一个轴。标题最佳功能值的轴:0.0797555包含类型线的对象。

流(formatstring fval output.funccount)
通过25191次函数评估,粒子温值达到了0.000000。
disp (output.hybridflag)
1

混合函数对结果进行了改进,plot函数显示的最终值与之前相同。这是因为plot函数只显示了粒子群算法的迭代,而不是混合函数的计算。混合函数使最终函数值非常接近真实的最小值0。的output.hybridflag.字段显示fmincon停止退出标志1,表明这一点x是一个真正的地方最低限度。

相关话题