主要内容

调谐粒子群优化过程

此示例显示了如何使用颗粒处理求解器。粒子群算法将称为群的颗粒人群移动到最小值函数。群体中每个粒子的速度根据三个因素而变化:

  • 惯性的影响(惰性选项)

  • 粒子访问的最佳位置的吸引力(自我调节量选项)

  • 对相邻粒子之间最佳位置的吸引力(社交重量级选项)

此示例显示了改变粒子群选项的一些影响。

何时修改选项

经常,颗粒处理使用其默认选项时,找到一个好的解决方案。例如,它优化rastriginsfcn很好,默认选项。该功能具有许多本地最小值,全球最低限度为0在这一点[0,0]

RNG默认%可再现性[X,FVAL,EXITFLAG,输出] =颗粒处理(@rastriginsfcn,2);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
FOMATSTRING ='颗粒温度使用%d函数评估达到了值%f。\ n';fprintf(formatstring,fval,output.funccount)
使用2560函数评估,颗粒温度达到了0.000000的值。

对于此功能,您知道最佳的目标值,因此您知道求解器找到了它。但是,如果您不知道解决方案怎么办?评估溶液质量的一种方法是重新运行求解器。

[X,FVAL,EXITFLAG,输出] =颗粒处理(@rastriginsfcn,2);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
fprintf(formatstring,fval,output.funccount)
使用1480功能评估,颗粒疗法达到了0.000000的值。

解决方案和功能评估的数量都与先前的运行相似。这表明求解器没有难以到达解决方案。

使用默认参数的难度函数困难

众所周知,Rosenbrock函数很难优化。此示例使用Rosenbrock函数的多维版本。该函数的最小值为0在这一点[1,1,1,...]

RNG默认%可再现性nvars = 6;%选择NVAR的任何偶数价值fun = @multirosopenbrock;[X,FVAL,EXITFLAG,输出] =颗粒处理(娱乐,nvars);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
fprintf(formatstring,fval,output.funccount)
使用12960函数评估,颗粒温度达到了3106.436648的值。

求解器找不到一个很好的解决方案。

约束搜索空间

尝试界定空间以帮助求解器找到一个好点。

lb = -10*一个(1,nvars);ub = -lb;[XBOUGDED,FVALBOUND,EXITFLAGBOUND,OUTPOTENBOUND] = PRAINSEVARM(FUN,NVARS,LB,UB);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
fprintf(formatstring,fvalbound,outputbounded.funccount)
使用71160函数评估,颗粒温度达到了0.000006的值。

求解器找到了一个更好的解决方案。但是,需要大量的功能评估。

更改选项

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

选项= optimoptions(“颗粒”,,,,“ MinneighborsFraction”,1);[xn,fvaln,exitflagn,outputn] = preamleswarm(fun,nvars,lb,ub,options);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
fprintf(FormatString,fvaln,outputn.funccount)
使用30180函数评估,颗粒温度达到了0.000462的值。

尽管求解器进行了更少的功能评估,但尚不清楚这是由于随机性还是更好的选项设置。

也许你应该提高自我调节量选项。

options.selfdjustmentWeight = 1.9;[xn2,fvaln2,exitflagn2,outputn2] = preamleswarm(fun,nvars,lb,ub,options);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
fprintf(formatstring,fvaln2,outputn2.funccount)
使用18780功能评估,颗粒疗法达到了0.000074的值。

这次颗粒处理进行了更少的功能评估。这种改进是由于随机性而导致的,还是期权设置真的值得?重新运行求解器并查看功能评估的数量。

[xn3,fvaln3,exitflagn3,outputn3] = preamleswarm(fun,nvars,lb,ub,options);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
fprintf(formatstring,fvaln3,outputn3.funccount)
使用53040函数评估,颗粒温度达到了0.157026的值。

这次功能评估的数量增加了。显然,这个自我调节量设置不一定会提高性能。

提供初始点

也许颗粒处理如果从已知点不远的地方开始,它会做得更好。尝试原点。在同一初始点给几个人。它们的随机速度确保它们不会保持在一起。

x0 =零(20,6);%将20个人设置为行矢量options.initialswarmmatrix = x0;%群的其余部分是随机的[xn3,fvaln3,exitflagn3,outputn3] = preamleswarm(fun,nvars,lb,ub,options);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
fprintf(formatstring,fvaln3,outputn3.funccount)
使用32100函数评估,颗粒温度达到了0.039015的值。

功能评估的数量再次减少。

矢量速度

多尖式布洛克功能允许进行矢量化功能评估。这意味着它可以同时评估群体中所有粒子的目标函数。这通常会大大加速求解器。

RNG默认%进行公平比较options.usevectorized = true;tic [xv,fvalv,exitflagv,outputv] = preamleswarm(fun,nvars,lb,ub,options);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
TOC
经过的时间为0.152962秒。
options.usevectorized = false;RNG默认TIC [XNV,FVALNV,EXITFLAGNV,outputnv] = pressionswarm(fun,nvars,lb,ub,options);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
TOC
经过的时间为0.421945秒。

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

图功能

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

选项= optimoptions(选项,'plotfcn',@pswplotbestf);RNG默认[X,FVAL,EXITFLAG,输出] =颗粒处理(Fun,NVARS,LB,UB,选项);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。

图颗粒处理包含一个轴对象。具有标题最佳功能值的轴对象:0.0797555包含一个类型行的对象。

fprintf(formatstring,fval,output.funccount)
使用24960函数评估,颗粒温度达到了0.079755的值。

使用更多的颗粒

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

RNG默认options.swarmsize = 200;[X,FVAL,EXITFLAG,输出] =颗粒处理(Fun,NVARS,LB,UB,选项);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。

图颗粒处理包含一个轴对象。具有标题最佳功能值的轴对象:0.000424241包含一个类型行的对象。

fprintf(formatstring,fval,output.funccount)
使用169400功能评估,颗粒疗法达到了0.000424的值。

混合功能

颗粒处理可以搜索几个吸引力盆地以达到一个良好的本地解决方案。但是,有时候,它没有达到足够准确的本地最低限度。尝试通过指定在粒子群算法停止后运行的混合功能来改善最终答案。将粒子的数量重置为其原始值60,以查看混合功能所产生的差异。

RNG默认options.hybridfcn = @fmincon;options.swarmsize = 60;[X,FVAL,EXITFLAG,输出] =颗粒处理(Fun,NVARS,LB,UB,选项);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。

图颗粒处理包含一个轴对象。具有标题最佳功能值的轴对象:0.0797555包含一个类型行的对象。

fprintf(formatstring,fval,output.funccount)
使用25191函数评估,颗粒温度达到了0.000000的值。
disp(output.hybridflag)
1

当混合功能改善结果时,绘图函数显示与以前相同的最终值。这是因为绘图函数仅显示粒子群算法迭代,而不是混合函数计算。混合函数导致最终功能值非常接近。输出。杂化字段显示Fmincon用出口标志1停止,表明X是真正的当地最低限度。

相关话题