主要内容

调优粒子群优化过程

这个例子展示了如何优化使用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。

函数计算的次数再次减少。

Vectorize速度

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。

图粒子暖包含一个轴对象。标题为Best Function Value: 0.0797555的axis对象包含一个类型为line的对象。

流(formatstring fval output.funccount)
通过24960次函数评估,粒子温暖值达到了0.079755。

使用更多的粒子

通常情况下,使用更多的粒子可以得到更精确的溶液。

rng默认的选项。SwarmSize = 200;[x, fval exitflag、输出]= particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。

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

流(formatstring fval output.funccount)
粒子温值达到0.000424使用169400函数评估。

混合函数

particleswarm可以通过几个吸引盆地来寻找一个好的局部解。然而,有时它并不能得到一个足够精确的局部最小值。通过指定一个在粒子群算法停止后运行的混合函数,尝试改进最终答案。将粒子数重置为初始值60,看看混合函数的效果。

rng默认的选项。HybridFcn = @fmincon;选项。SwarmSize = 60;[x, fval exitflag、输出]= particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:相对于上一个选项的目标值的变化。MaxStallIterations迭代小于options . functional tolerance。

图粒子暖包含一个轴对象。标题为Best Function Value: 0.0797555的axis对象包含一个类型为line的对象。

流(formatstring fval output.funccount)
通过25191次函数评估,粒子温值达到了0.000000。
disp (output.hybridflag)
1

混合函数对结果进行了改进,plot函数显示的最终值与之前相同。这是因为plot函数只显示了粒子群算法的迭代,而不是混合函数的计算。混合函数使最终函数值非常接近真实的最小值0。的output.hybridflag字段显示fmincon以退出标志1停止,表示x是一个真正的局部极小值。

相关的话题