%--带有收缩因子的微粒群算法,解决有约束的情况--
%清除屏幕
clc
clear
format long;
%-----------------------------参数设置-------------------------------------
c1 = 2; %学习因子1 ,一般在[0,2]
c2 = 2; %学习因子2 ,一般在[0,2]
% c1 = 2.04344; %学习因子1 ,一般在[0,2]
% c2 = 0.94874; %学习因子2 ,一般在[0,2]
k1 = 0.7298; %惯性权重,一般取[0,1.4],但[0.8,1.2]收敛速度更快
Dimension = 2; %搜索空间维数(未知数个数)
Popsize = 100; %初始化群体个体数目
MaxDT = 1000; %最大迭代次数
DivH = 0.25; % 多样性系数上限
DivL = 0.05; % 多样性系数下限
itera = 1; % 迭代次数
%--------------初始化种群的个体(可以在这里限定位置和速度的范围)---------------
% 计算算法搜索空间最大半径--保证种群多样性
x1minmax = [13 100];
x2minmax = [0 100];
Rmax = sqrt((x1minmax(2)-x1minmax(1))^2 + (x2minmax(2)-x2minmax(1))^2)
% 1)随机初始化位置
x1 = rand(Popsize,1)*(100-13) + 13; % x1 = [13,100]
x2 = rand(Popsize,1)*100; % x2 = [0, 100]
% 2)随机初始化速度
v1max = 0.4*( max(x1) - min(x1));
v2max = 0.4*( max(x2) - min(x2));
v1 = rand(Popsize,1) * v1max;
v2 = rand(Popsize,1) * v2max;
fit = fitness(x1,x2,itera,Popsize); % 计算各微粒的适应度
Pbest = [x1 x2]; % 初始化个体(微粒)最佳位置
Fbest = fit; % 初始化个体(微粒)最佳位置时的适应度
[minfit, indfit] = min(fit); % 寻找群体全局适应度最佳的个体(微粒)[适应度,微粒号]
PGbest = [x1(indfit) x2(indfit)]; % 全局适应度最佳的个体(微粒)位置
FGbest = minfit; % 全局适应度最佳的个体(微粒)适应度
dir = 1;
%--------------进入主要循环,按照公式依次迭代,直到满足精度要求---------------
for itera=2:MaxDT
w = 1-itera*0.9/(MaxDT);
% 计算并比较种群多样性系数
Div1 = diversity(Popsize, Dimension, Pbest, Rmax);
% if Div1 < DivL
% dir = 1;
% elseif Div1 > DivH
% dir = -1;
% end
% if dir > 0 && Div1 < DivL
% dir = -1;
% end
% if dir < 0 && Div1 > DivH
% dir = 1;
% end
% dir1(itera) = dir;
% Div2(itera) = Div1;
%-------------更新粒子飞行速度-------------
% v1 = k1*(w * v1 + dir*(c1 * rand * (Pbest(:,1) - x1) + c2 * rand * (PGbest(1) - x1))); % 更新 v1
% v2 = k1*(w * v2 + dir*(c1 * rand * (Pbest(:,2) - x2) + c2 * rand * (PGbest(2) - x2))); % 更新 v2
v1 = k1*(w * v1 + dir*(c1 * rand * (Pbest(:,1) - x1) + c2 * rand * (PGbest(1) - x1))); % 更新 v1
v2 = k1*(w * v2 + dir*(c1 * rand * (Pbest(:,2) - x2) + c2 * rand * (PGbest(2) - x2))); % 更新 v2
%-------------限制粒子飞行速度-------------
v1(find( v1 > v1max)) = v1max;
v1(find( v1 < -v1max)) = -v1max;
v2(find( v2 > v2max)) = v2max;
v2(find( v2 < -v2max)) = -v2max;
%-------------更新粒子位置 -------------
x1 = x1 + v1; % 更新 x1
x2 = x2 + v2; % 更新 x2
%-------------限制粒子位置-------------
x1(find( x1 > 100 )) = 100;
x1(find( x1 < 13 )) = 13;
x2(find( x2 > 100 )) = 100;
x2(find( x2 < 0 )) = 0;
[new_fit]= fitness(x1, x2, itera, Popsize); % 计算微粒的适应度
%-------------更新个体(微粒)最佳适应度和最佳位置-------------
for i = 1 : Popsize
if new_fit(i) < Fbest(i)
Pbest(i,:) = [x1(i) x2(i)];
Fbest(i) = new_fit(i);
end
end
[minfit(itera), indfit] = min(new_fit); % 在本次迭代中,寻找最佳适应度值和微粒号
%-------------更新全局最佳适应度和最佳位置-------------
if minfit(itera) < PGbest
PGbest = [x1(indfit) x2(indfit)]; % updating gworst
FGbest = minfit(itera); % updating gworst
end;
%-------------最佳适应度和最佳位置-------------
PG_BESTx(itera,:) = [x1(indfit) x2(indfit)];
FG_BEST(itera) = FGbest;
end
PGbest
FGbest
% dir1;
% Div2;
%-------------绘图-------------
figure(3)
% 优化函数收敛曲线
t = 1:MaxDT;
subplot(2,1,1);
plot(t,FG_BEST,'b');
grid on
title('函数最优值与迭代次数的关系')
xlabel('迭代次数 i');
ylabel('函数最优值 FG-BEST');
% 二维粒子的优化过程中的位置
subplot(2,1,2);
plot(PG_BESTx(t,1),PG_BESTx(t,2),'*b');
hold on
plot(PG_BESTx(MaxDT,1),PG_BESTx(MaxDT,2),'dr','LineWidth',3);
title('最佳微粒位置')
xlabel('微粒位置x(1)');
ylabel('微粒位置x(2)');
PSO粒子群优化算法的改进仿真matlab2021a测试-源码
版权申诉
54 浏览量
2021-10-01
23:43:28
上传
评论
收藏 11KB ZIP 举报
mYlEaVeiSmVp
- 粉丝: 1926
- 资源: 19万+
最新资源
- HTML+CSS制作的个人博客网页.zip
- IMG_20240521_094903.jpg
- 基于htmlde 爱心代码,但HTML网页源码.zip
- 51单片机实现LED流水灯
- 基于Python的obEspoir分布式游戏框架设计源码
- 基于python的机械设计实用计算器,可计算电动机,传动装置,V带轮,齿轮,轴,轴承的几何或者力,运动学参数数值+源码+开发文档
- 基于HTML +JavaScript的元旦倒计时代码.docx
- 【Unity资源免费分享】孩子益智小游戏unity 5x系列Baby Doll House Cleaning
- 【资源免费分享】集市游戏(uniyt案例)
- 数据整理结果 2023-12-7 192544 6.dta
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈