
我们将继续研究多维优化的方法,其次是粒子群方法,它会寻找全局最小值。
理论
该算法非常简单:

每个粒子在特定时刻的位置由以下公式计算:
哪里 -协调特定粒子的最佳解决方案, -这个时代所有粒子的最佳解决方案的坐标, 和 -加权因子(为特定模型选择), 是惯性系数,它可以取决于一个时代的数目,那么粒子的速度就会平稳地变化。
测试功能
由于很高兴了解该方法的工作原理,因此我们将获得更多测试功能:
藏起来parabol(x) = sum(u->u*u, x)
而且,事实上,MRC本身:
function mdpso(; nparts = 50, ndimes = 2, ages = 50,
但是,对于工程图,计算会花费更长的时间,但会更加美观:
using Plots pyplot() function ploter(l, u, xy, z, n_age ) contour(Xs, Ys, Zs, fill = true);

mdpso(C1 = [1.2 1.2], C2 = [1.1 1.1], Ac = [0.08 0.08], lower = [-4 -4], upper = [4 4], ages = 30)

fun = ekly mdpso(C1 = [1.7 1.7], C2 = [1.7 1.7], Ac = [0.07 0.07], lower = [-5 -5], upper = [5 5], ages = 15)


fun = himmelblau mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-5 -5], upper = [5 5], ages = 20, parts = 50)


fun = holdertable mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-10 -10], upper = [10 10], ages = 20, parts = 50)


fun = levy13 mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-10 -10], upper = [10 10], ages = 20, parts = 50)


fun = shaffer4 mdpso(C1 = [1.1 1.1], C2 = [1.0 1.0], Ac = [0.09 0.09], lower = [-100 -100], upper = [100 100], ages = 20, parts = 50)


真正令人沮丧的是,对参数和随机性元素大惊小怪:如果没有一个粒子在全局最小值附近飞行,那么这整个事物可能会落入局部:
fun = rastrigin mdpso(mdpso(C1 = [0.1 0.1], C2 = [1 1], Ac = [0.08 0.08], lover = low, upper = up, ages = 30))


是的,老 不太 好的Rosenbrock仍然无法理解:
fun = rosenbrok mdpso(C1 = [1.7 1.7], C2 = [1.5 1.5], Ac = [0.15 0.15], lover = low, upper = up, ages = 20, nparts = 50) ... Age № 20 xbest: 0.37796421341886866 0.12799160066705667 Fmin: 0.409026370833564


但是正如我之前所说,您可以使用FDM搜索近似于全局最小值的近似值,然后指定Nelder-Mead:
单纯形法 vecl(x) = sqrt( sum(u -> u*u, x) ) function sortcoord(Mx) N = size(Mx,2) f = [fun(Mx[:,i]) for i in 1:N]
ofNelderMid(fit = [0.37796 0.127992]) ... 92 0.00022610400555036366 [1.0, 1.0] 93 0.00015987967588703512 [1.0, 1.0] 94 0.00011305200343052599 [1.0, 1.0] 2-element Array{Float64,1}: 0.9999999996645973 0.9999999995466575
对于经典的MFC,停止标准并不是一目了然的:最佳点可以保留多个时代的位置,某些粒子之间的距离也不能长时间保持不变。 因此,使用了时代数的限制。 为了增加找到全局最小值的机会,有必要增加粒子和历元的数量,这在内存和时间方面都非常昂贵(不要开玩笑,每次迭代中每个维调用50次目标函数)。
品德
- 如果您不希望或无法使用复杂的现代方法,则可以使用更简单的方法组合
- 很多时候,对于问题,有一种狭窄的方法(例如,针对山沟功能)
- 建议手头有几个不同的MO,以便进行一致的比较
- 并非总是可以将您的任务放到方法中并立即获得正确的答案-您应该花时间研究,更改参数,如果看不到浮雕,则至少应打印出中间计算值以跟踪收敛。
今天就这些了,谢谢您的关注,并祝大家一切顺利!