粒子群算法代码:
%%
% 粒子群算法(Particle Swarm Optimization, PSO)
% 文献引用:Kennedy J, Eberhart R. Particle swarm optimization[C]//Proceedings of ICNN'95-international conference on neural networks. IEEE, 1995, 4: 1942-1948.
%%
% 输入:NP(种群大小),max_iter(最大迭代次数),dim(问题的维度),fobj(目标函数),搜索空间上界(ub),搜索空间下界(lb)
% 输出:gbest_fit(全局最优适应度值),gbest(全局最优解),cg_curve(收敛曲线)
function [gbest_fit,gbest,cg_curve]=PSO(NP,max_iter,dim,fobj,ub,lb)
%% 参数设置
v_max=5; %最大速度
v_min=-5; %最小速度
w_max=0.9; %最大权重
w_min=0.4; %最小权重
c1=1.5; %个体学习因子
c2=1.5; %社会学习因子
cg_curve=zeros(max_iter,1); %预分配内存
%% 种群初始化
[pop,fit]=Initialization(NP,dim,fobj,ub,lb);
%% 速度初始化
pop_v=v_min+(v_max-v_min)*rand(NP,dim);
%% 记录全局和个体最优
[gbest_fit,index]=min(fit);
gbest=pop(index,:);
pbest=pop;
pbest_fit=fit;
%% 开始迭代
for t=1:max_iter
for i=1:NP
r1=rand(1,dim);
r2=rand(1,dim);
w=w_max-t*(w_max-w_min)/max_iter; %更新权重
pop_v(i,:)=w*pop_v(i,:)+c1.*r1.*(pbest(i,:)-pop(i,:))+c2.*r2.*(gbest -pop(i,:)); %粒子速度更新
pop_v(i,:)=BoundaryCheck(pop_v(i,:),dim,v_max,v_min); %检查速度是否越界
pop(i,:)=pop(i,:)+pop_v(i,:); %粒子位置更新
pop(i,:)=BoundaryCheck(pop(i,:),dim,ub,lb); %粒子位置越界检查
fit(i)=fobj(pop(i,:)); %计算新个体的适应度值
if fit(i)<pbest_fit(i) %更新个体历史最优
pbest(i,:)=pop(i,:);
pbest_fit(i)=fit(i);
end
if fit(i)<gbest_fit %更新全局最优
gbest=pop(i,:);
gbest_fit=fit(i);
end
end
cg_curve(t)=gbest_fit;
end
end
%%
% 种群初始化函数
% 输入:NP(种群大小),dim(问题的维度),fobj(目标函数),搜索空间上界(ub),搜索空间下界(lb)
% 输出:init_pop(种群矩阵),fit(种群适应度矩阵)
function [init_pop,fit]=Initialization(NP,dim,fobj,ub,lb)
fit=ones(NP,1); %分配初始内存
init_pop=lb+(ub-lb)*rand(NP,dim);
for i=1:NP
fit(i)=fobj(init_pop(i,:));
end
end
%%
% 边界检查函数
% 输入:x(种群个体),dim(问题的维度),搜索空间上界(ub),搜索空间下界(lb)
% 输出:y(调整后的个体)
function [y]=BoundaryCheck(x,dim,ub,lb)
for i=1:dim
if x(i)>ub
x(i)=ub;
end
if x(i)<lb
x(i)=lb;
end
end
y=x;
end
main函数代码:
clear %清空工作区
clc %清空命令行
close all %关闭所有图形窗口
%%
% main函数
% 参数设置
NP=20; %种群大小
dim=30; %维度
max_iter=500; %最大迭代次数
lb=-100; %下界
ub=100; %上界
fobj=@Sphere; %目标函数
%% 算法调用
[gbest_fit,gbest,cg_curve]=PSO(NP,max_iter,dim,fobj,ub,lb);
disp(['gbest_fit=',num2str(gbest_fit)]); %输出最优值
plot(cg_curve);
%%
% 目标函数定义
function o =Sphere(x)
o=sum(x.^2);
end
优化效果:(存在一定的随机性,追求效果可扩大迭代次数)