此示例显示了如何优化使用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的值。
函数评估的数量再次下降。
的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
是一个真正的地方最低限度。