此示例显示了如何优化使用粒子热
解算器。粒子群算法将称为群的粒子群移动到目标函数的最小值。群中每个粒子的速度根据三个因素变化:
惯性效应(惰性范围
选项)
吸引到粒子访问过的最佳位置(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。
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。
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。
fprintf(formatstring、fval、output.funcount)
使用25191次函数求值,particleswarm达到值0.000000。
disp(output.hybridflag)
1.
虽然混合函数改进了结果,但绘图函数显示的最终值与之前相同。这是因为绘图函数仅显示粒子群算法迭代,而不显示混合函数计算。混合函数导致最终函数值非常接近真实的最小值0output.hybridflag.
字段显示铁铬镍铁合金
停止退出标志1,表明这一点x
是一个真正的地方最低限度。