免疫优化算法:matlab
tic
clc;
close all;
clear all;
%% *-*-*-*-*-*-*-*-*-*-*-*-*-*-初始化*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
D=2;
NP=50;% 免疫个体数目;
Xs=4;% 变量上限;
Xx=-4;% 变量下限;
G=100;% 免疫代数;
Pm=0.7;% 变异概率;
alfa=1;% 激励度系数;
belta=0.2;% 激励度系数;
detas=1;% 相似度阈值;
gen=0;
Nc1=10;% 克隆个数;
deta0=1*Xs;%领域初始范围;
%% *-*-*-*-*-*-*-*-*-*-*-*-*-*-初始种群*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
f=rand(D,NP)*(Xs-Xx)+Xx;
for np=1:NP
Fit(np)=func1(f(:,np));
end
%% *-*-*-*-*-*-*-*-*-*-计算个体浓度和激励度*-*-*-*-*-*-*-*-*-*-*-*-*-
% *-*-*-*-*-*-*-*-*-*-*基于欧氏距离计算每个抗体之间的距离*-*-*-*-*-*-*-*-*-*-
for np=1:NP
for j=1:NP
nd(j)=sum(sqrt((f(:,np)-f(:,j)).^2));
% 抗体之间的相似度,当相似度小于阈值是才会为相似度赋值1,否则是0;
if nd(j)<detas
nd(j)=1;
else
nd(j)=0;
end
end
% 计算抗体浓度;
ND(np)=sum(nd)/NP;
end
% *-*-*-*-*-*-*-*-*-*激励度算子计算激励度*-*-*-*-*-*-*-*
% 激励系数与抗体组合,构成新的抗体;
Fit=alfa*Fit-belta*ND;
[SortFit,Index]=sort(Fit);
% 由小到大排序;
Sortf=f(:,Index);
%% *-*-*-*-*-*-*-*-*-*-*-*-*-免疫循环*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
while(gen<G)
% 激励度前NP/2个个体免疫操作,根据实际需要,自行修改;
for i=1:NP/2
a=Sortf(:,i);
Na=repmat(a,1,Nc1);
deta=deta0/gen;
for j =1:Nc1
for ii=1:D
if rand<Pm
%变异操作,实现小扰动,变异源邻域的搜索;
Na(ii,j)=Na(ii,j)+(rand-0.5)*deta;
end
% 边界条件处理;
if Na(ii,j)>Xs || Na(ii,j)<Xx
Na(ii,j)=rand*(Xs-Xx)+Xx;
end
end
end
Na(:,1)=Sortf(:,i);
for j =1:Nc1
NaFit(j)=func1(Na(:,j));
end
[NaSortFit,Index]=sort(NaFit);
aFit(i)=NaSortFit(1);
NaSortf=Na(:,Index);
af(:,i)=NaSortf(:,1);
end
%% *-*-*-*-*-*-*-*-*-*-再一次计算种群激励度*-*-*-*-*-*-*-*-*-*-*-
for np=1:NP/2
for j=1:NP/2
nda(j)=sum(sqrt((af(:,np)-af(:,j)).^2));
if nda(j)<detas
nda(j)=1;
else
nda(j)=0;
end
end
aND(np)=sum(nda)/NP;
end
aFit=alfa*aFit-belta*aND;
%% *-*-*-*-*-*-*-*-*-*-*-*-*-种群刷新*-*-*-*-*-*-*-*-*-*-*-*-*-*
bf=rand(D,NP/2)*(Xs-Xx)+Xx;
for np=1:NP/2
bFit(np)=func1(bf(:,np));
end
%% *-*-*-*-*-*-*-*-*-*-新生成种群激励度*-*-*-*-*-*-*-*-*-*-*-*-*-
for np=1:NP/2
for j=1:NP/2
ndc(j)=sum(sqrt((bf(:,np)-bf(:,j)).^2));
if ndc(j)<detas
ndc(j)=1;
else
ndc(j)=0;
end
end
bND(np)=sum(ndc)/(NP/2);
end
bFit=alfa*bFit-belta*bND;
%% *-*-*-*-*-*-*-*-*-*-免疫种群与新生种群合并*-*-*-*-*-*-*-*-*-*-*
f1=[af,bf];
Fiti=[aFit,bFit];
[SortFit,Index]=sort(Fiti);
Sortf=f1(:,Index);
gen=gen+1;
trace(gen)=func1(Sortf(:,1));
% 当每次运算的结果与前一次结果误差小于10^(-6),结束迭代;
if gen>20 && (trace(gen)-trace(gen-1))<10^(-6)
break
end
end
Best_X=Sortf(:,1);
Aim_Functio=trace(end);
plot(trace)
xlabel("免疫次数");
ylabel("目标函数");
title("亲和度进化曲线");
disp("目标函数最小值为:"+trace(end))
disp("自变量取值为:"+Best_X)
disp("共迭代了:"+gen+"次")
toc
%% *-*-*-*-*-*结束*-*-*-*-*
function result = func1(x)
% result=sum(x.^2);
% result=3*cos(x(1)*x(2))+x(1)+x(2);
% result=x+10*sin(5*x)+7*cos(4*x);
% result=5*sin(x(1)*x(2))+x(1).^2+x(2).^2;
result=3*cos(x(1)*x(2))+x(1)+x(2);
end