1. pso算法的不足:
容易陷入局部最优、算法后期容易出现振荡现象。
2. 改进目的
通过引入模拟退火机制,将pso算法中的“自身认知”和“社会认知”部分进行自适应调整,以改善算法的性能,从而实现算法的全局收敛和局部收敛的有效平衡。
-
前期:标准PSO算法寻优。
-
提高了算法搜索整个过程的速率
-
为后期进行了随机初始化的工作,增加了种群的多样性
-
-
后期:引入模拟退火原理。
-
增强了粒子群的全局搜索能力,很大程度上解决了pso算法的局部收敛性。
-
3. 改进步骤[1]
4. 源代码
m = 30; %粒子数量
d = 2; %粒子维度
ac1 = 2.0; % 自身认知函数初始值
ac2 = 0.5;
sa_k = 0.98; %衰减因子
iwe = 3; % 惯性权重调整步数
iter_max = 200;
w_max = 0.8;
w_min = 0.4;
v_max = 1;
v_min = -1;
x_max = 5;
x_min = -5;
t_star = 100;
t_end = 0.01;
pos = 0 ;
%% 1、初始化
x = rand(m,d) * (x_max - x_min) + x_min;
v = rand(m,d) * (v_max - v_min) + v_min;
%% 初始化个体最优位置,最优值
p = x; %每个粒子的个体最优解的位置
pbest = ones(m,1);
for i =1:m
pbest(i) = func(x(i,:));
end
%% 初始化全局最优位置,最优值
g = ones(1,d); %全局最优位置
gbest = inf;
for i=1:m
if(pbest(i) < gbest)
g = p(i,:)
gbest = pbest(i);
end
end
% 迭代
t_cur = t_star;
c1 = 1.5;
c2 = 1.5;
for i = 1:iter_max
for j = 1:m
%% 2、计算每个粒子的个体最优值
if i * 2 < iter_max % 迭代前期采取标准的学习因子更新速度
if (func(x(j,:)) < pbest(j))
p(j,:) = x(j,:); %更新个体最优解位置
pbest(j) = func(x(j,:)); %更新个体最优解
end
else % 迭代后期
deta_p = func(x(j,:)) - pbest(j);
if (deta_p < 0)
p(j,:) = x(j,:); %更新个体最优解位置
pbest(j) = func(x(j,:)); %更新个体最优解
else %(Metropolis算法)
p1 = exp(-1 * deta_p / t_cur);
r = 0;
for ii = 1:10
r = max(r,rand);
end
if p1 > r % 接受较差的值
p(j,:) = x(j,:); %更新个体最优解位置
pbest(j) = func(x(j,:)); %更新个体最优解
c1 = ac1 * exp(-t_cur/t_star)*rand;
%c2 = ac2 * (1+exp(-t_cur/t_star))*rand;
end
end
end
%% 3、计算整个群体的全局最优值
if (pbest(j) < gbest)
gbest0 = gbest;
g = p(j,:);
gbest = pbest(j);
end
%% 4、对粒子的速度、位置进行进化
%w = w_max + (w_max - w_min) *(i-1)/(iwe-1);
w = w_max - (w_max - w_min) * i / iter_max;
v(j,:) = w*v(j,:)+c1 * rand*(p(j,:)-x(j,:))+c2 * rand*(g-x(j,:));
x(j,:) = x(j,:) + v(j,:);
%% 5、进行边界处理
for k = 1:d
if (v(j,k) > v_max | v(j,k) < v_min)
v(j,k) = rand * (v_max - v_min) + v_min;
end
if (x(j,k) > x_max | x(j,k) < x_min)
x(j,k) = rand * (x_max - x_min) + x_min;
end
end
end
gb(i) = gbest;
t_cur = sa_k * t_cur;
end
%g; %最优个体位置
disp( '最小值为:');
gbest
plot(gb)
legend(legend_str);
xlabel('迭代次数');
ylabel('适应度值');
title("适应度进化曲线")
function results = func(x)
results = 5*cos(x(1)*x(2))+x(1)*x(2)+x(2)^3;
end
5.对比结果
6. 参考文献
[1]于海平, 刘会超, and 吴志健. "基于模拟退火的自适应粒子群优化算法的改进策略." 计算机应用研究 29.12(2012):3.