MATLAB粒子群优化算法实现(PSO)
这里我采用的是结构体,这样处理更清晰 Matlab结构体的使用如下 每个个体pop的属性有
- 速度v
- 位置x
- 个体最优位置pbest (pop个体)
- 个体适应度f
全局最优个体gbest(pop个体)
其他参数的定义 算法流程
代码:
%% ------初始格式化-------------
clear
clc;
format long;
%% ------给定初始化条件---------
c1=2; %学习因子1
c2=2; %学习因子2
w=0.7298; %惯性权重
MaxDT=200; %最大迭代次数
popsize=20; %初始化群体个体数目
poplength = 10; %个体长度
Vmax=1;
Vmin=-1;
popmax=5;
popmin=-5;
%% ---------初始化种群-----------
% 定义个体结构体
% -速度v -位置x -个体最优位置pbest -个体适应度f
for i=1:popsize
pop(i).x = popmin+(popmax-popmin)*rand(1,poplength); %随机初始化位置
pop(i).v = rand(1,poplength);
pop(i).f = ackley(pop(i).x);
pop(i).pbest = pop(i);
end
res =[];
%% 选出种群中最优的个体
gbest = pop(1);% 初始化为第一个
for i = 2 : popsize
if gbest.f < pop(i).f
gbest = pop(i);
end
end
%% 开始进行迭代
for i = 1 : MaxDT
% 对于每一个个体
for j = 1 : popsize
% 群落的影响和自己惯性,判断对自己速度的影响
pop(j).v = w * pop(j).v + c1*rand*(pop(j).pbest.x - pop(j).x) + c2*rand*(gbest.x-pop(j).x);
% 速度越界处理
pop(j).v(pop(j).v<Vmin) = Vmin;
pop(j).v(pop(j).v>Vmax) = Vmax;
% 改变位置
pop(j).x = pop(j).x + pop(j).v;
% 位置越界处理
pop(j).x(pop(j).x>popmax) = popmax;
pop(j).x(pop(j).x<popmin) = popmin;
% 更新局部最优解
pop(j).f = ackley(pop(j).x);
if pop(j).pbest.f > pop(j).f
pop(j).pbest = pop(j);
end
% 更新全局最优解
if pop(j).pbest.f < gbest.f
gbest = pop(j);
end
end
% 记录迭代过程
res = [res gbest.f];
end
%% -----计算结果
plot(res)
title(['适应度曲线 ' '终止次数=' num2str(MaxDT)]);
xlabel('进化代数');
ylabel('适应度')
目标函数
function [out]=ackley(in)
n=length(in(1,:));
x=in;
e=exp(1);
out = (20 + e ...
-20*exp(-0.2*sqrt((1/n).*sum(x.^2,2))) ...
-exp((1/n).*sum(cos(2*pi*x),2)));
return
运行结果:
|