粒子群算法(PSO)matlab代码实现
%% 清空命令行和工作区
clc
clear
%% 目标函数:求解函数在[0,50]区间上的最小值
f=@(x) x.*sin(x).*cos(2*x) - 2.*sin(3*x)+3*x.*sin(4*x);
%% 初始化算法参数
population=50; % 粒子的数量
dimension=1; % 解的维度(一维数轴)
iter_max=100; % 迭代终止条件
location_limit=[0,50]; % 粒子运动区间限制
velocity_limit=[-10,10]; % 速度限制
omega=0.7; % 粒子惯性权重
c1=0.5; %自身经验系数
c2=0.5; %群体经验系数
%% 绘制目标函数图像
figure(1) %创建一个图像窗口
ezplot(f,[location_limit(1),location_limit(2)]);
%% 初始化粒子群
pop=location_limit(1)+(location_limit(2)-location_limit(1))*rand(population,dimension);
% 粒子群的初始位置是随机生成的,pop是一个population行dimension列的矩阵
v=rand(population,dimension);
optimal_position1=pop;
optimal_position2=zeros(1,dimension);
optimal_value1=ones(population,dimension)*inf;
optimal_value2=ones(iter_max,1)*inf;
optimal_record=ones(iter_max,1)*inf;
hold on
plot(pop,f(pop),'ro');
title('初始状态图');
hold off
pause(0.2);
figure(2);
%% 迭代循环
for iter=1:iter_max
% 1.函数值计算及最优解记录更新
f_value=f(pop);
for i=1:population
if f_value(i)<optimal_value1(i)
optimal_value1(i)=f_value(i);
optimal_position1(i,:)=pop(i,:);
end
end
if min(optimal_value1)<optimal_value2
[optimal_value2,index]=min(optimal_value1);
optimal_position2=optimal_position1(index,:);
end
% 2.更新粒子速度和位置
v=v*omega ...
+ c1*rand*(optimal_position1-pop) ...
+ c2*rand*(repmat(optimal_position2,population,1)-pop);
% 3.速度越界处理
v(v<velocity_limit(1))=velocity_limit(1);
v(v>velocity_limit(2))=velocity_limit(2);
% 4.更新粒子位置
pop=pop +v;
% 5.位置越界处理
pop(pop<location_limit(1))=location_limit(1);
pop(pop>location_limit(2))=location_limit(2);
% 6.迭代过程中记录最优值记录
optimal_record(iter)=optimal_value2;
% 7.绘图
x=location_limit(1):0.01:location_limit(2);
subplot(1,2,1)
plot(x,f(x),'b-',pop,f(pop),'ro');
subplot(1,2,2)
plot(optimal_record);
title('最优适应度进化过程');
pause(0.01);
iter=iter+1;
end
x=location_limit(1):0.01:location_limit(2);
figure(3);
plot(x,f(x),'b-',pop,f(pop),'ro');
title('最终位置状态');
disp('最优函数值',num2str(optimal_value2));
disp('\n最优解',num2str(optimal_position2));