这个例子展示了如何优化使用particleswarm
解算器。粒子群算法将一群粒子种群移动到目标函数的最小值。群中每个粒子的速度根据三个因素变化:
惯性的影响(InertiaRange
选项)
吸引粒子到达的最佳位置(SelfAdjustmentWeight
选项)
对相邻粒子之间的最佳位置的吸引(SocialAdjustmentWeight
选项)
这个例子展示了改变粒子群选项的一些效果。
通常,particleswarm
在使用默认选项时找到一个好的解决方案。例如,它优化rastriginsfcn
使用默认选项。这个函数有许多局部极小值,和一个全局极小值0
在点(0,0)
.
rng默认的%的再现性[x, fval exitflag、输出]= particleswarm (@rastriginsfcn 2);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
formatstring =“使用%d函数计算,粒子温暖达到值%f。\n”;流(formatstring fval output.funccount)
通过2560次函数评估,粒子温值达到了0.000000。
对于这个函数,你知道最优目标值,所以你知道解算器找到了它。但是如果你不知道解决方案呢?评估解决方案质量的一种方法是重新运行求解器。
[x, fval exitflag、输出]= particleswarm (@rastriginsfcn 2);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fval output.funccount)
通过1480次函数评估,粒子温值达到了0.000000。
解决方案和函数求值的数量都与上次运行类似。这表明求解器在得到解决方案时没有困难。
众所周知,罗森布罗克函数是一个很难优化的函数。本例使用了Rosenbrock函数的多维版本。函数的最小值为0
在点(1, 1, 1,……)
.
rng默认的%的再现性据nvar = 6;为nvars选择任意偶数有趣= @multirosenbrock;[x, fval exitflag、输出]= particleswarm(有趣,据nvar);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fval output.funccount)
通过12960函数计算,粒子温暖值达到3106.436648。
求解者没有找到一个很好的解。
尝试包围空间,以帮助求解器找到一个好的点。
磅= -10 * 1(1,据nvar);乌兰巴托=磅;[xbounded, fvalbounded exitflagbounded outputbounded] = particleswarm(磅,有趣,据nvar乌兰巴托);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fvalbounded outputbounded.funccount)
通过71160次函数评估,粒子暖度达到了0.000006。
解算者找到了一个更好的解。但这需要大量的函数计算。
如果把更多的注意力放在整个空间的最佳邻域上,而不是某个较小的邻域上,求解器可能会收敛得更快。
选择= optimoptions (“particleswarm”,“MinNeighborsFraction”1);[xn, fvaln exitflagn outputn] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fvaln outputn.funccount)
通过30180次函数评估,粒子暖度达到了0.000462。
虽然求解器需要更少的函数计算,但尚不清楚这是由于随机性还是更好的选项设置。
也许你应该提高SelfAdjustmentWeight
选择。
选项。SelfAdjustmentWeight = 1.9;[xn2, fvaln2 exitflagn2 outputn2] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fvaln2 outputn2.funccount)
通过18780次函数评估,粒子暖度达到了0.000074。
这一次particleswarm
更少的函数计算。这种改进是由于随机性,还是选项设置真的值得?重新运行求解器并查看函数计算的次数。
[xn3, fvaln3 exitflagn3 outputn3] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fvaln3 outputn3.funccount)
通过53040次函数评价,粒子温暖值达到了0.157026。
这一次,函数计算的数量增加了。很显然,这SelfAdjustmentWeight
设置不一定能提高性能。
也许particleswarm
如果从离解决方案不远的已知点开始,效果会更好。尝试原点。给几个人相同的起始点。它们随机的速度确保它们不会保持在一起。
x0 = 0(20日6);%设置20个个体作为行向量选项。InitialSwarmMatrix = x0;剩余的蜂群是随机的[xn3, fvaln3 exitflagn3 outputn3] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fvaln3 outputn3.funccount)
通过32100函数评估,粒子温暖值达到了0.039015。
函数计算的次数再次减少。
的multirosenbrock
函数允许向量化函数求值。这意味着它可以同时对群中所有粒子的目标函数进行评估。这通常会大大加快求解器的速度。
rng默认的做一个公平的比较选项。UseVectorized = true;Tic [xv,fvalv,exitflagv,outputv] = particleswarm(fun,nvars,lb,ub,options);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
toc
运行时间为0.214309秒。
选项。UseVectorized = false;rng默认的Tic [xnv,fvalnv,exitflagnv,outputnv] = particleswarm(fun,nvars,lb,ub,options);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
toc
运行时间为0.609586秒。
向量化计算的时间大约是串行计算的一半。
您可以使用绘图函数查看求解器的进度。
选择= optimoptions(选项,“PlotFcn”, @pswplotbestf);rng默认的[x, fval exitflag、输出]= particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fval output.funccount)
通过24960次函数评估,粒子温暖值达到了0.079755。
通常情况下,使用更多的粒子可以得到更精确的溶液。
rng默认的选项。SwarmSize = 200;[x, fval exitflag、输出]= particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fval output.funccount)
粒子温值达到0.000424使用169400函数评估。
particleswarm
可以通过几个吸引盆地来寻找一个好的局部解。然而,有时它并不能得到一个足够精确的局部最小值。通过指定一个在粒子群算法停止后运行的混合函数,尝试改进最终答案。将粒子数重置为初始值60,看看混合函数的效果。
rng默认的选项。HybridFcn = @fmincon;选项。SwarmSize = 60;[x, fval exitflag、输出]= particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。
流(formatstring fval output.funccount)
通过25191次函数评估,粒子温值达到了0.000000。
disp (output.hybridflag)
1
混合函数对结果进行了改进,plot函数显示的最终值与之前相同。这是因为plot函数只显示了粒子群算法的迭代,而不是混合函数的计算。混合函数使最终函数值非常接近真实的最小值0。的output.hybridflag
字段显示fmincon
以退出标志1停止,表示x
是一个真正的局部极小值。