📄 main.m
字号:
%------免疫粒子群优化算法(Particle Swarm Optimization)-----------
%------初始格式化--------------------------------------------------
clear all;
clc;
format long;
%------给定初始化条件----------------------------------------------
c1=1.4962; %学习因子1
c2=1.4962; %学习因子2
w=0.7298; %惯性权重
MaxDT=1000; %最大迭代次数
D=10; %搜索空间维数(未知数个数)
N=100; %初始化群体个体数目
eps=10^(-20); %设置精度(在已知最小值时候用)
DS=10; %每隔DS次循环就检查最优个体是否变优
replaceP=0.6; %粒子的概率大于replaceP将被免疫替换
minD=1e-015; %粒子间的最小距离
Psum=0; %个体最佳的和
%------初始化种群的个体------------
for i=1:N
for j=1:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
end
end
%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i=1:N
p(i)=fitness(x(i,:),D); %fitness是计算各个粒子适应度的函数,见文件fitness.m
y(i,:)=x(i,:);
end
pg=x(1,:); %Pg为全局最优
for i=2:N
if fitness(x(i,:),D)<fitness(pg,D)
pg=x(i,:);
end
end
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------
for t=1:MaxDT
for i=1:N
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:),D)<p(i)
p(i)=fitness(x(i,:),D);
y(i,:)=x(i,:);
end
if p(i)<fitness(pg,D)
pg=y(i,:);
end
end
Pbest(t)=fitness(pg,D);
% if fitness(pg,D)<eps %如果结果满足精度要求则跳出循环
% break;
% end
%-----------开始进行免疫----------------
if t>DS
if mod(t,DS)==0 && (Pbest(t-DS+1)-Pbest(t))<1e-020 %如果连续DS代数,群体中的最优没有明显变优,则进行免疫.
%在函数测试的过程中发现,经过一定代数的更新,个体最优不完全相等,但变化非常非常小,
%我认为这个时候也应用免疫了,所以我没有用“Pbest(t-DS+1)=Pbest(t)”作为判断条件,
%不过“(Pbest(t-DS+1)-Pbest(t))<1e-020”是否合理也值得探讨。
for i=1:N %先计算出个体最优的和
Psum=Psum+p(i);
end
for i=1:N %免疫程序
for j=1:N %计算每个个体与个体i的距离
distance(j)=abs(p(j)-p(i));
end
num=0;
for j=1:N %计算与第i个个体距离小于minD的个数
if distance(j)<minD
num=num+1;
end
end
PF(i)=p(N-i+1)/Psum; %计算适应度概率
PD(i)=num/N; %计算个体浓度
a=rand; %随机生成计算替换概率的因子
PR(i)=a*PF(i)+(1-a)*PD(i); %计算替换概率
end
for i=1:N
if PR(i)>replaceP
x(i,:)=rand(1,D);
end
end
end
end
end
%------最后给出计算结果
disp('*************************************************************')
disp('函数的全局最优位置为:')
Solution=pg'
disp('最后得到的优化极值为:')
Result=fitness(pg,D)
disp('*************************************************************')
%------算法结束-------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -