惯性权重w体现的是粒子继承先前的速度的能力,Shi,Y最先将惯性权重w引入到粒子群算法中,并分析指出一个较大的惯性权值有利于全局搜索,而一个较小的权值则更利于局部搜索。因此,在迭代适应度的同时对惯性权重进行迭代有利于帮助我们寻找最优解
- 一、线性递减惯性权重
- 1.迭代思想
- 2.迭代公式
- 3.代码实现
- 二、自适应惯性权重
- 1.迭代思想
- 2.迭代公式
- 3.代码实现
- 三、随机惯性权重
- 1.迭代思想
- 2.迭代公式
- 3.代码实现
一、线性递减惯性权重
1.迭代思想
在迭代的前期选取较大的惯性权重,有利于粒子群进行全局搜索。而在迭代的末期,则更加急迫地得到一个可行解,因此倾向于局部搜索。
在图形上体现为:迭代的初期粒子移动范围很大,在迭代的过程中逐渐变小,然后所有的粒子都在找到的最优解附近移动
2.迭代公式
由公式看出,随着迭代次数的增大,惯性权重是逐渐变小的。当d=0,w=w_strart,当达到最大迭代次数,即d=K时,w=w_end。
注:迭代公式不唯一,比如可以在(d/k)这一项加一个平方
3.代码实现
只需要在进行速度的迭代前,输入好迭代惯性权重的公式即可
for d = 1:K % 开始迭代,一共迭代K次for i = 1:n % 依次更新第i个粒子的速度与位置 w = w_start - (w_start - w_end) * d / K; v(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:)); % 更新第i个粒子的速度
二、自适应惯性权重
1.迭代思想
假设我们现在在求一个最小值问题,有若干的粒子,那么粒子的适应度越小,就说明这个粒子所处的位置越好,惯性权重应该越小,让其尽可能少移动。相反,粒子的适应度越大,说明这个粒子所处位置不怎么好,那么应该尽可能多地移动,跳出这个位置,让其惯性权重越大
2.迭代公式
看公式的第一行,如果该粒子的适应度小于平均适应度,那么说明其离理论最小值近,那么适应度就应该比较小。当其适应度是所有粒子中最小的时,w=w_min,当其适应度恰好是均值时,w=w_max
看公式的第二行,如果该粒子的适应度大于平均适应度,那么说明其离理论最小值远,那么适应度就应该比较大,设定为w_max
3.代码实现
同样,在更新粒子的速度前将惯性权重进行更改
for d = 1:K % 开始迭代,一共迭代K次for i = 1:n % 依次更新第i个粒子的速度与位置f_i = fit(i); % 取出第i个粒子的适应度f_avg = sum(fit)/n; % 计算此时适应度的平均值f_min = min(fit); % 计算此时适应度的最小值if f_i <= f_avg if f_avg ~= f_min % 如果分母为0,我们就干脆令w=w_minw = w_min + (w_max - w_min)*(f_i - f_min)/(f_avg - f_min);elsew = w_min;endelsew = w_max;endv(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:)); % 更新第i个粒子的速度
三、随机惯性权重
1.迭代思想
随机惯性权重使用随机的惯性权重,可以避免在迭代前期局部搜索能力的不足;也可以避免在迭代后期全局搜索能力的不足。
其操作就是在给定惯性权重时添加随机数
2.迭代公式
3.代码实现
sigma是正态分布的随机扰动项的标准差(一般取0.2-0.5之间)
for d = 1:K % 开始迭代,一共迭代K次for i = 1:n % 依次更新第i个粒子的速度与位置w = w_min + (w_max - w_min)*rand(1) + sigma*randn(1);v(i,:) = w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:)); % 更新第i个粒子的速度