主要内容

调整粒子群优化过程

此示例显示了如何优化使用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次函数计算,Particleswarm达到了0.000000的值。

解决方案和函数计算的数量都类似于前一次运行。这表明解决者在得到一个解决方案时没有困难。

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

众所周知,Rosenbrock函数是一个难以优化的函数。这个例子使用了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)
Particleswarm通过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)
Particleswarm通过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)
Particleswarm通过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.414598秒。
选项。UseVectorized = false;rng默认的TIC [XNV,FVALNV,EXITFLAGNV,OUTPORNV] = PIMICLESSWARM(FUN,NVARS,LB,UB,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
TOC.
经过时间为0.997604秒。

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

绘图功能

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

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

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

使用更多的粒子

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

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

流(formatstring fval output.funccount)
Particleswarm通过169400函数评估达到了值0.000424。

混合函数

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

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

流(formatstring fval output.funccount)
通过25191次函数计算,Particleswarm达到了0.000000的值。
disp (output.hybridflag)
1

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

相关话题