前言概述
粒子速度更新公式如下:
vid = wvid-1 + c1r1(pbestid-xid)+ c2r2(gbestd-xid)
在研究完粒子群算法中有关惯性权重的优化之后,我们把目光转向速度更新公式的后两项,根据之前所学可知:个体学习因子c1和社会学习因子c2决定了粒子本身经验信息和其他粒子的经验信息对粒子运行轨迹的影响,其反映了粒子群之间的信息交流。
较大的c1值,会使粒子过多地在自身的局部范围内搜索
较大的c2值,则又会促使粒子过早收敛到局部最优值。
为了有效地控制粒子的飞行速度,使算法达到全局搜索与局部搜索两者间的有效平衡,Clerc构造了引入收缩因子的PSO模型,采用了压缩因子,这种调整方法通过合适选取参数,可确保PSO算法的收敛性,并可取消对速度的边界限制。
参数设置
- 个体学习因子c1 = 2.05 (应用较多)
- 社会学习因子 c2 = 2.05(应用较多)
- 惯性权重 w = 0.9
- C = c1+c2 = 4.1
- 收缩因子
综上,速度更新公式如下
示例代码
求解函数y = 7cos(5x) + 4*sin(x)在[-5,5]内的最大值
…… ……
%% 初始化参数
c1 = 2.05; % 每个粒子的个体学习因子
c2 = 2.05; % 每个粒子的社会学习因子
C = c1 + c2;
w = 0.9; % 惯性权重
fai = 2/abs((2-C-sqrt(C^2-4*C)));% 收缩因子
%% 初始化粒子的位置和速度
…… ……
%% 计算适应度
…… ……
%% 迭代K次来更新速度与位置
fitnessbest = ones(K,1); % 初始化每次迭代得到的最佳的适应度
for d = 1:K % 开始迭代,一共迭代K次
for i = 1:n % 依次更新第i个粒子的速度与位置
v(i,:) = fai * (w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:))); % 更新第i个粒子的速度
x(i,:) = x(i,:) + v(i,:); % 更新第i个粒子的位置
% 如果粒子的位置超出了定义域,就对其进行调整
…… ……
…… ……
end
…… ……
function y = Obj_fun1(x)
y = 7*cos(5*x) + 4*sin(x);
end
运行结果如下
对比未经优化的粒子群算法
可知,求得的最优解更接近实际最优解
参考文献:Eberhart R C . Comparing inertia weights and
constriction factors in optimization[C]//
Proceedings of the 2000 IEEE Congress on
Evolutionary Computation, La Jolla, CA. IEEE, 2000.