主要内容

调优粒子群优化过程

这个例子展示了如何优化使用particleswarm解算器。粒子群算法将称为群的粒子种群移动到目标函数的最小值。群中每个粒子的速度变化取决于三个因素:

  • 惯性的影响(InertiaRange选项)

  • 粒子访问过的最佳位置的吸引力(SelfAdjustmentWeight选项)

  • 相邻粒子中对最佳位置的吸引(SocialAdjustmentWeight选项)

这个例子展示了改变粒子swarm选项的一些效果。

何时修改选项

通常,particleswarm在使用默认选项时找到了一个很好的解决方案。例如,它进行了优化rastriginsfcn好吧,默认选项。这个函数有很多局部最小值,还有一个全局最小值0在点(0,0)

rng默认的%的再现性[x, fval exitflag、输出]= particleswarm (@rastriginsfcn 2);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
formatstring ='particleswarm使用%d函数计算达到了%f的值。\n';流(formatstring fval output.funccount)
使用2560次函数评估,Particleswarm达到了0.000000的值。

对于这个函数,你知道最优的目标值,所以你知道求解器找到了它。但如果你不知道解呢?评估解质量的一种方法是重新运行求解器。

[x, fval exitflag、输出]= particleswarm (@rastriginsfcn 2);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
流(formatstring fval output.funccount)
使用1480次函数计算,Particleswarm达到了0.000000的值。

解和函数求值的数量都与前面的运行相似。这表明求解器在得到解时没有困难。

使用默认参数的困难目标函数

众所周知,Rosenbrock函数是一个很难优化的函数。本例使用了Rosenbrock函数的多维版本。该函数的最小值为0在点(1, 1, 1,……)

rng默认的%的再现性据nvar = 6;%为nvars选择任何偶数值有趣= @multirosenbrock;[x, fval exitflag、输出]= particleswarm(有趣,据nvar);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
流(formatstring fval output.funccount)
Particleswarm使用12960个函数求值达到了3106.436648。

求解者没有找到一个很好的解。

绑定搜索空间

尝试边界空间,以帮助求解者找到一个好的点。

磅= -10 * 1(1,据nvar);乌兰巴托=磅;[xbounded, fvalbounded exitflagbounded outputbounded] = particleswarm(磅,有趣,据nvar乌兰巴托);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
流(formatstring fvalbounded outputbounded.funccount)
使用71160次函数评估,Particleswarm达到了0.000006的值。

求解器找到了一个更好的解。但这样做需要进行非常多的函数求值。

改变选项

如果求解器更多地关注整个空间中的最佳邻域,而不是某个较小的邻域,它可能会更快地收敛。

选择= optimoptions (“particleswarm”,“MinNeighborsFraction”1);[xn, fvaln exitflagn outputn] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
流(formatstring fvaln outputn.funccount)
使用30180次函数求值,Particleswarm达到了值0.000462。

虽然求解器采用了更少的函数计算,但尚不清楚这是由于随机性还是由于更好的选项设置。

也许你应该提高SelfAdjustmentWeight选择。

选项。SelfAdjustmentWeight = 1.9;[xn2, fvaln2 exitflagn2 outputn2] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
流(formatstring fvaln2 outputn2.funccount)
使用18780个函数求值,Particleswarm达到了值0.000074。

这一次particleswarm用了更少的功能评估。这种改进是由于随机性,还是选项设置真的值得?重新运行求解器,看看函数求值的次数。

[xn3, fvaln3 exitflagn3 outputn3] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
流(formatstring fvaln3 outputn3.funccount)
Particleswarm使用53040个函数求值达到了值0.157026。

这一次函数求值的数量增加了。很显然,这SelfAdjustmentWeight设定不一定能提高表现。

提供一个初始点

也许particleswarm如果从一个已知的点开始,并且离解不太远,会做得更好。尝试原点。给出几个在同一初始点的个体。它们的随机速度确保了它们不会停留在一起。

x0 = 0(20日6);%设置20个个体作为行向量选项。InitialSwarmMatrix = x0;其余的蜂群是随机的。[xn3, fvaln3 exitflagn3 outputn3] = particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
流(formatstring fvaln3 outputn3.funccount)
使用32100次函数计算,Particleswarm达到了值0.039015。

函数求值的次数再次减少。

Vectorize速度

multirosenbrock函数允许向量化的函数计算。这意味着它可以同时对群中所有粒子的目标函数进行评估。这通常会大大加快求解器的速度。

rng默认的做一个公平的比较。选项。UseVectorized = true;Tic [xv,fvalv,exitflagv,outputv] = particleswarm(fun,nvars,lb,ub,options);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
toc
运行时间为0.374568秒。
选项。UseVectorized = false;rng默认的Tic [xnv,fvalnv,exitflagnv,outputnv] = particleswarm(fun,nvars,lb,ub,options);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。
toc
运行时间为0.870666秒。

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

绘制函数

可以使用plot函数查看求解器的进展情况。

选择= optimoptions(选项,“PlotFcn”, @pswplotbestf);rng默认的[x, fval exitflag、输出]= particleswarm(乐趣,据nvar磅,乌兰巴托,选项);
优化结束:目标值相对于上一个OPTIONS的变化。MaxStallIterations小于OPTIONS.FunctionTolerance。

{

流(formatstring fval output.funccount)
使用24960个函数求值,Particleswarm达到了值0.079755。

使用更多的粒子

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

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

{

流(formatstring fval output.funccount)
使用169400函数评估,Particleswarm达到了0.000424的值。

混合函数

particleswarm可以通过搜索几个吸引的盆地,到达一个好的本地解决方案。但有时,它并不能得到一个足够精确的局部最小值。尝试通过指定一个在粒子群算法停止后运行的混合函数来改进最终答案。将粒子数重置为初始值60,看看混合函数产生的差异。

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

{

流(formatstring fval output.funccount)
Particleswarm使用25191个函数求值达到了0.000000的值。
disp (output.hybridflag)
1

虽然混合函数改善了结果,但plot函数显示的最终值与之前相同。这是因为plot函数只显示了粒子群算法的迭代,而没有显示混合函数的计算。混合函数导致最终的函数值非常接近真实的最小值0。的output.hybridflag字段显示fmincon在出口标志1处停止,表示x是一个真正的局部极小值。

相关的话题

Baidu
map