粒子群(PSO)算法的matlab程序

粒子群(PSO)算法的matlab程序,第1张

%不知道你具体的问题纤迹是什么,下面是一个最基本的pso算法解决函数极值问题,如果是一些大型的问题,需要对速度、惯性常数、和自适应变异做进一步优化,希望对你有帮助

function y = fun(x)

y=-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289

%下面是主程序

%% 清空环境

clc

clear

%% 参数初始化

%粒子群算法中的两个参数

c1 = 1.49445

c2 = 1.49445

maxgen=200 % 进化次数

sizepop=20 %种群规模

Vmax=1%速度限制

Vmin=-1

popmax=5%种群限制

popmin=-5

%% 产生初始粒子和速度

for i=1:sizepop

%随机产生一个种群

pop(i,:)=5*rands(1,2) %初始种群

V(i,:)=rands(1,2) %初始化速度

%计算适应度

fitness(i)=fun(pop(i,:)) %染色体的适应码昌度

end

%找最好的染色体

[bestfitness bestindex]=min(fitness)

zbest=pop(bestindex,:) %全局最佳

gbest=pop %个体最佳

fitnessgbest=fitness %个体最佳适应度值

fitnesszbest=bestfitness %全局最佳适应度值

%% 迭代寻优

for i=1:maxgen

for j=1:sizepop

%速度更新

V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:))

V(j,find(V(j,:)>Vmax))=Vmax

V(j,find(V(j,:)<Vmin))=Vmin

%种群更新

pop(j,:)=pop(j,:)+0.5*V(j,:)

pop(j,find(pop(j,:)>popmax))=popmax

pop(j,find(pop(j,:)<popmin))=popmin

%自适应变异(避免粒子群算法陷入局部最优

if rand>0.8

k=ceil(2*rand)%ceil朝正无穷大方向取整

pop(j,k)=rand

end

%适应度值

fitness(j)=fun(pop(j,:))

%个体最优更新

if fitness(j) <fitnessgbest(j)

gbest(j,:) = pop(j,:)

fitnessgbest(j) = fitness(j)

end

%群体最优更新

if fitness(j) <fitnesszbest

zbest = pop(j,:)

fitnesszbest = fitness(j)

end

end

yy(i)=fitnesszbest

end

%% 结果分析

plot(yy)

title(['适应度曲线 ' '终止代数毁模并=' num2str(maxgen)])

xlabel('进化代数')ylabel('适应度')

以上回答你满意么?

%标准PSO算法源代码(matlab)

%标准粒群优化算法程氏漏序

% 2007.1.9 By jxy

%测试函数:f(x,y)=100(x^2-y)^2+(1-x)^2, -2.048<x,y<2.048

%求解函数最小值

global popsize%种群规模

%global popnum %种群数量

global pop%种群

%global c0 %速度惯性系数,为0—1的随机数

global c1 %个体最优导向系数

global c2 %全局最优导向系数

global gbest_x %全局最优解x轴坐标

global gbest_y %全局最优解y轴坐标

global best_fitness %最优解

global best_in_history%最优解变化轨迹

global x_min %x的下限

global x_max %x的上限

global y_min %y的下限

global y_max %y的上限

global gen%迭代次数

global exetime%当前迭代次数

global max_velocity %最大速度

initial %初始化

for exetime=1:gen

outputdata%实时输出结果

adapting %计算适应值

errorcompute()%计算当前种群适值标准差

updatepop %更新粒子位置

pause(0.01)

end

clear i

clear exetime

clear x_max

clear x_min

clear y_min

clear y_max

%程序初始化

gen=100%设置进化代数

popsize=30%设置种群规模大小

best_in_history(gen)=inf %初始化全局历史最优解

best_in_history(gen)=inf %初始化全局历史最优解帆世

max_velocity=0.3 %最大速度限制

best_fitness=inf

%popnum=1 %设置种群数量

pop(popsize,8)=0 %初始化种群,创建popsize行5列的0矩阵

%种群数组第1列为x轴坐标,第2列为y轴坐标,第3列为x轴歼轿烂速度分量,第4列为y轴速度分量

%第5列为个体最优位置的x轴坐标,第6列为个体最优位置的y轴坐标

%第7列为个体最优适值,第8列为当前个体适应值

for i=1:popsize

pop(i,1)=4*rand()-2%初始化种群中的粒子位置,值为-2—2,步长为其速度

pop(i,2)=4*rand()-2%初始化种群中的粒子位置,值为-2—2,步长为其速度

pop(i,5)=pop(i,1) %初始状态下个体最优值等于初始位置

pop(i,6)=pop(i,2) %初始状态下个体最优值等于初始位置

pop(i,3)=rand()*0.02-0.01 %初始化种群微粒速度,值为-0.01—0.01,间隔为0.0001

pop(i,4)=rand()*0.02-0.01 %初始化种群微粒速度,值为-0.01—0.01,间隔为0.0001

pop(i,7)=inf

pop(i,8)=inf

end

c1=2

c2=2

x_min=-2

y_min=-2

x_max=2

y_max=2

gbest_x=pop(1,1) %全局最优初始值为种群第一个粒子的位置

gbest_y=pop(1,2)

%适值计算

% 测试函数为f(x,y)=100(x^2-y)^2+(1-x)^2, -2.048<x,y<2.048

%计算适应值并赋值

for i=1:popsize

pop(i,8)=100*(pop(i,1)^2-pop(i,2))^2+(1-pop(i,1))^2

if pop(i,7)>pop(i,8)%若当前适应值优于个体最优值,则进行个体最优信息的更新

pop(i,7)=pop(i,8) %适值更新

pop(i,5:6)=pop(i,1:2) %位置坐标更新

end

end

%计算完适应值后寻找当前全局最优位置并记录其坐标

if best_fitness>min(pop(:,7))

best_fitness=min(pop(:,7))%全局最优值

gbest_x=pop(find(pop(:,7)==min(pop(:,7))),1) %全局最优粒子的位置

gbest_y=pop(find(pop(:,7)==min(pop(:,7))),2)

end

best_in_history(exetime)=best_fitness %记录当前全局最优

%实时输出结果

%输出当前种群中粒子位置

subplot(1,2,1)

for i=1:popsize

plot(pop(i,1),pop(i,2),'b*')

hold on

end

plot(gbest_x,gbest_y,'r.','markersize',20)axis([-2,2,-2,2])

hold off

subplot(1,2,2)

axis([0,gen,-0.00005,0.00005])

if exetime-1>0

line([exetime-1,exetime],[best_in_history(exetime-1),best_fitness])hold on

end

%粒子群速度与位置更新

%更新粒子速度

for i=1:popsize

pop(i,3)=rand()*pop(i,3)+c1*rand()*(pop(i,5)-pop(i,1))+c2*rand()*(gbest_x-pop(i,1)) %更新速度

pop(i,4)=rand()*pop(i,4)+c1*rand()*(pop(i,6)-pop(i,2))+c2*rand()*(gbest_x-pop(i,2))

if abs(pop(i,3))>max_velocity

if pop(i,3)>0

pop(i,3)=max_velocity

else

pop(i,3)=-max_velocity

end

end

if abs(pop(i,4))>max_velocity

if pop(i,4)>0

pop(i,4)=max_velocity

else

pop(i,4)=-max_velocity

end

end

end

%更新粒子位置

for i=1:popsize

pop(i,1)=pop(i,1)+pop(i,3)

pop(i,2)=pop(i,2)+pop(i,4)

如果你是想找一个三阶的多项式拟合你的离散数据的话,可以用PSO。游消

直接用基础pso就可以,不过你的适应度函数是三维(因为是3阶的多项式),要利用你的数据编一个,常用的话就是差值平方和,就是fitness=(真实值1-多项式计算值1)^2+(真实值2-多项式计算值2)^2+...... 你有13组数据就可以加13次够了,不过提醒一下,你的每个变量的范围要注意设置。

如果还有不懂的可以M我,不雹枝过我源磨敏不常在(⊙o⊙)哦,谢谢


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12375045.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存