调谐粒子群优化过程
此示例显示了如何使用颗粒处理
求解器。粒子群算法将称为群的颗粒人群移动到最小值函数。群体中每个粒子的速度根据三个因素而变化:
惯性的影响(
惰性
选项)粒子访问的最佳位置的吸引力(
自我调节量
选项)对相邻粒子之间最佳位置的吸引力(
社交重量级
选项)
此示例显示了改变粒子群选项的一些影响。
何时修改选项
经常,颗粒处理
使用其默认选项时,找到一个好的解决方案。例如,它优化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。
fprintf(formatstring,fval,output.funccount)
使用24960函数评估,颗粒温度达到了0.079755的值。
使用更多的颗粒
通常,使用更多颗粒获得更准确的解决方案。
RNG默认options.swarmsize = 200;[X,FVAL,EXITFLAG,输出] =颗粒处理(Fun,NVARS,LB,UB,选项);
优化结束了:目标值对最后一个选项的相对变化。MaxStalliterationsIterations Iterations少于选项。FunctionTolerance。
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。
fprintf(formatstring,fval,output.funccount)
使用25191函数评估,颗粒温度达到了0.000000的值。
disp(output.hybridflag)
1
当混合功能改善结果时,绘图函数显示与以前相同的最终值。这是因为绘图函数仅显示粒子群算法迭代,而不是混合函数计算。混合函数导致最终功能值非常接近。输出。杂化
字段显示Fmincon
用出口标志1停止,表明X
是真正的当地最低限度。