主要内容

调整粒子群优化过程

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

  • 惯性效应(惰性范围选项)

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

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

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

何时修改选项

经常粒子热使用其默认选项时会找到一个好的解决方案。例如,它优化rastriginsfcn这个函数有很多局部极小值,还有一个全局极小值0当时[0,0].

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

对于此函数,您知道最佳目标值,因此您知道解算器找到了它。但是如果你不知道解决办法呢?评估解决方案质量的一种方法是重新运行解算器。

[x,fval,exitflag,output]=particleswarm(@rastriginsfcn,2);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
fprintf(formatstring、fval、output.funcount)
particleswarm使用1480次函数求值达到值0.000000。

解决方案和函数评估的数量都与上一个运行类似。这表明求解器没有困难到达解决方案。

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

众所周知,Rosenbrock函数是一个难以优化的函数。此示例使用多维版本的Rosenbrock函数。该函数的最小值为0当时[1,1,1,......].

RNG.违约%为了再现性nvars=6;%选择NVAR的任何偶数值fun=@multirosenbrock;[x,fval,exitflag,output]=particleswarm(fun,nvars);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
fprintf(formatstring、fval、output.funcount)
ParticleSwarm使用12960功能评估达到了价值3106.436648。

解算器没有找到很好的解决方案。

绑定了搜索空间

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

lb=-10*one(1,nVAR);ub=-lb;[xbounded,fvalbounded,exitflagbounded,outputbounded]=particleswarm(fun,nVAR,lb,ub);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
fprintf(formatstring、fvalbounded、outputbounded.funccount)
通过71160功能评估,particleswarm达到值0.000006。

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

更改选项

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

选项= Optimoptions(“particleswarm”,“明尼堡分离”,1); [xn,fvaln,exitflagn,outputn]=particleswarm(乐趣,nvars,lb,ub,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
fprintf(FormatString,Fvaln,Outputn.Funccount)
使用30180函数评估,ParticleSwarm达到0.000462。

虽然解算器进行的功能评估较少,但不清楚这是由于随机性还是由于更好的选项设置。

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

options.self-adjustmentweight=1.9;[xn2,fvaln2,exitflagn2,outputn2]=particleswarm(乐趣,nvars,lb,ub,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
fprintf(formatstring、fvaln2、outputn2.funcount)
通过18780次功能评估,particleswarm的值达到了0.000074。

这次粒子热进行了更少的函数计算。这是由于随机性造成的,还是选项设置真的值得?重新运行解算器并查看函数计算的数量。

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

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

提供初始点

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

x0 =零(20,6);%将20个个人设置为行向量options.initialswarmmatrix = x0;%群的其余部分是随机的[XN3,FVALN3,EXITFLAGN3,OUTPORN3] = ParticleSwarm(有趣,NVARS,LB,UB,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。
fprintf(formatstring、fvaln3、outputn3.funcount)
通过32100次功能评估,particleswarm达到值0.039015。

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

速度矢量化

这个多罗森布鲁克函数允许矢量化函数评估。这意味着它可以同时评估群中所有粒子的目标函数。这通常会大大加快解算器的速度。

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

矢量化计算大约花费了串行计算的一半时间。

绘图功能

可以使用打印功能查看解算器的进度。

选项=最佳选项(选项,'plotfcn',@pswplotbestf);rng违约[x,fval,exitflag,output]=particleswarm(乐趣,nvars,lb,ub,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。

Figure particleswarm包含一个Axis对象。标题为“最佳功能值:0.0797555”的Axis对象包含一个line类型的对象。

fprintf(formatstring、fval、output.funcount)
使用24960功能评估,ParticleSwarm达到0.079755。

使用更多的粒子

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

RNG.违约options.swarmsize = 200;[x,fval,exitflag,output]=particleswarm(乐趣,nvars,lb,ub,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。

Figure particleswarm包含一个轴对象。标题为“最佳功能值:0.000424241”的轴对象包含一个line类型的对象。

fprintf(formatstring、fval、output.funcount)
通过169400次功能评估,particleswarm达到值0.000424。

混合函数

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

RNG.违约options.hybridfcn = @fmincon;options.swarmsize = 60;[x,fval,exitflag,output]=particleswarm(乐趣,nvars,lb,ub,选项);
优化结束:最后一个options的目标值中的相对变化.maxstallerations迭代率小于options.functionTolectance。

Figure particleswarm包含一个Axis对象。标题为“最佳功能值:0.0797555”的Axis对象包含一个line类型的对象。

fprintf(formatstring、fval、output.funcount)
使用25191次函数求值,particleswarm达到值0.000000。
disp(output.hybridflag)
1.

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

相关话题