粒子群优化算法
算法概要
particleswarm 基于肯尼迪和艾伯哈特 [1] 所述的算法,使用梅苏拉-蒙特斯和科埃略-科埃略 [2] 以及佩德森 [3] 建议的修改。
粒子群算法首先创建初始粒子,并赋予它们初始速度。
它计算每个粒子位置的目标函数,并确定最佳(最低)函数值和最佳位置。
它会根据当前速度、粒子各自的最佳位置及其邻点的最佳位置来选择新速度。
然后,它以迭代方式更新粒子位置(新位置是旧位置加上速度,经过修改以使粒子保持在一定边界内)、速度和邻点。
迭代继续进行,直到算法达到停止条件。
以下是步骤的详细信息。
初始化
默认情况下,particleswarm 在边界内随机均匀地创建粒子。如果存在无界分量,particleswarm 创建从 -1000 到 1000 的随机均匀分布的粒子。如果您只有一个边界,particleswarm 会对创建移位,将该边界作为端点,创建间隔宽度为 2000。粒子 i 的位置为 x(i),这是一个包含 nvars 个元素的行向量。使用 InitialSwarmSpan 选项控制初始群的跨度。
同样,particleswarm 在范围 [-r,r] 内随机均匀地创建初始粒子速度 v,其中 r 是初始范围的向量。分量 k 的范围是 min(ub(k) - lb(k),InitialSwarmSpan(k))。
particleswarm 计算目标函数在所有粒子上的值。它记录每个粒子 i 的当前位置 p(i)。在后续迭代中,p(i) 将是粒子 i 找到最佳目标函数值的位置。而 b 是所有粒子中最好的:b = min(fun(p(i)))。d 是使得 b = fun(d) 的位置。
particleswarm 将邻域大小 N 初始化为 minNeighborhoodSize = max(2,floor(SwarmSize*MinNeighborsFraction))。
particleswarm 初始化惯量 W = max(InertiaRange);如果 InertiaRange 为负,则设置 W = min(InertiaRange)。
particleswarm 初始化停滞计数器 c = 0。
为了方便表示,设置变量 y1 = SelfAdjustmentWeight 和 y2 = SocialAdjustmentWeight,其中 SelfAdjustmentWeight 和 SocialAdjustmentWeight 是选项。
迭代步骤
该算法对群进行如下更新。对于所在位置为 x(i) 的粒子 i:
选择包含
N个粒子的随机子集S,而不是i。求邻点中的最佳目标函数值
fbest(S),以及具有最佳目标函数值的邻点的位置g(S)。对于长度为
nvars的均匀 (0,1) 分布的随机向量u1和u2,更新速度v = W*v + y1*u1.*(p-x) + y2*u2.*(g-x).此更新使用以下各项的加权和:
先前的速度
v当前位置与粒子所见的最佳位置之间的差值
p-x当前位置与当前邻域中最佳位置的差值
g-x
更新位置
x = x + v。强制执行边界。如果
x的任何分量在边界之外,则将其设置为等于该边界。对于那些刚刚设置为边界的分量,如果该分量的速度v指向边界外,则将该速度分量设置为零。计算目标函数
f = fun(x)的值。如果
f < fun(p),则设置p = x。此步骤确保p有粒子所见的最佳位置。算法的下一个步骤应用于整个群的参数,而不是单个粒子。请考虑群中粒子
j中的最小值f = min(f(j))。如果是
f < b,则设置b = f和d = x。此步骤确保b在群中具有最佳目标函数值,并且d具有最佳位置。如果在上一步骤中最佳函数值降低,则设置
flag = true。否则,flag = false。flag的值将用于下一步骤。更新邻点。如果
flag = true:设置
c = max(0,c-1)。将
N设置为minNeighborhoodSize。如果
c < 2,则设置W = 2*W。如果
c > 5,则设置W = W/2。确保
W在InertiaRange选项的边界内。
如果
flag = false:设置
c = c+1。设置
N = min(N + minNeighborhoodSize,SwarmSize)。
停止条件
particleswarm 迭代,直到达到停止条件。
| 停止选项 | 停止测试 | 退出标志 |
|---|---|---|
MaxStallIterations 和 FunctionTolerance | 在前 MaxStallIterations 次迭代中,最佳目标函数值 g 的相对变化小于 FunctionTolerance。 | 1 |
MaxIterations | 迭代次数达到 MaxIterations。 | 0 |
OutputFcn 或 PlotFcn | OutputFcn 或 PlotFcn 可以停止迭代。 | -1 |
ObjectiveLimit | 最佳目标函数值 g 小于 ObjectiveLimit。 | -3 |
MaxStallTime | 最佳目标函数值 g 在最后 MaxStallTime 秒内没有变化。 | -4 |
MaxTime | 函数运行时间超过 MaxTime 秒。 | -5 |
如果 particleswarm 停止并返回退出标志 1,它可以选择在退出后调用混合函数。
参考
[1] Kennedy, J., and R. Eberhart. "Particle Swarm Optimization." Proceedings of the IEEE International Conference on Neural Networks. Perth, Australia, 1995, pp. 1942–1945.
[2] Mezura-Montes, E., and C. A. Coello Coello. "Constraint-handling in nature-inspired numerical optimization: Past, present and future." Swarm and Evolutionary Computation. 2011, pp. 173–194.
[3] Pedersen, M. E. "Good Parameters for Particle Swarm Optimization." Luxembourg: Hvass Laboratories, 2010.