粒子群算法(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:populationif f_value(i)<optimal_value1(i)optimal_value1(i)=f_value(i);optimal_position1(i,:)=pop(i,:);endendif 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;
endx=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));