免疫算法(Immunity Algorithm),MATLAB代码直接复制
免疫算法简介
免疫算法是模仿生物免疫机制,结合基因的进化机理,人工构造出的一种新型智能优化算法。采用群体搜索策略,通过迭代计算,最终以较大的概率得到问题的最优解。相比于其他算法,免疫算法利用自身产生多样性和维持机制的特点,保证了群体多样性,克服了‘早熟’问题,可以得到全局最优解。具有自适应性,随机性并行性,全局收敛性,种群多样性等特点。

01算法原理
算法流程图:

流程介绍:
(1)初始化免疫算法参数;
(2)随机产生初始种群,计算个体亲和度、抗体浓度和激励度,并按激励度排序;
(3)取激励度前 NP/2个个体进行克隆、变异、克隆抑制的免疫操作,免疫后的种群进行激励度计算;
(4)随机生成 NP/2个个体的新种群,并计算个体亲和度、抗体浓度和激励度;免疫种群和随机种群合并,按激励度排序,进行免疫迭代;
(5)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。
关于原理介绍本文就不再细讲:大家可以参考这篇文章,写的很详细。免疫算法及MATLAB入门实例 - 知乎 (zhihu.com)

02代码编写
本文编制代码与网上流传代码不同,网上流传代码,适应度曲线可能会忽高忽低,这是因为,他们没有比较全局最佳适应度。且网上的代码是直接将种群激励度进行合并,作者认为这样做有似乎有些不妥,因为种群激励度并非适应度。作者改善后的代码如下,可以直接套用CEC2005函数。需要的童鞋直接复制即可。
function [fMin , Bestf,trace ] = IA (NP, G,Xx,Xs,D,fobj )
%D---免疫个体维数
%NP---免疫个体数目
%Xs---取值上限
%Xx----取值下限
%G----最大免疫代数
pm=0.7; %变异概率
alfa=1.8; %激励度系数
belta=1.1; %激励度系数
detas=0.2; %相似度阈值
gen=0; %免疫代数
Nc1=round(NP*0.3); %克隆个数
UB= Xs.*ones( 1,D ); % Lower limit/bounds/ a vector
deta0=3.*UB; %邻域范围初值
%初始种群
%Initialize the positions of search agents
f=initialization(NP,D,Xs,Xx);
Xs = Xs';
Xx = Xx';
f = f';
for np=1:NP
MSLL(np)=fobj(f(:,np)');
end
[hh,Index] = sort(MSLL);
fMin = hh(1);
Sortf=f(:,Index);
Bestf =Sortf(:,1);
%计算个体浓度和激励度
for np=1:NP
for j=1:NP
nd(j)=sum(sqrt((f(:,np)-f(:,j)).^2)); %亲和度,欧氏距离
if nd(j)<detas
nd(j)=1;
else
nd(j)=0;
end
end
ND(np)=sum(nd)/NP; %抗体浓度
end
MSLL=alfa*MSLL-belta*ND; %抗体激励度
%%%%%%%%%%%%%%%%%%%激励度按升序排列%%%%%%%%%%%%%%%%%%%%%%
[SortMSLL,Index]=sort(MSLL);
Sortf=f(:,Index);
%免疫循环
while gen<G
for i=1:NP/2
%选择激励度为前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(ii);
end
end
%边界条件处理
Na( :, j ) = Bounds( Na( :, j ), Xx,Xs,D );
end
Na(:,1)=Sortf(:,i); %保留克源个体
%克隆抑制,保留亲和度最高个体
for j=1:Nc1
NaMSLL(j)=fobj(Na(:,j)');
end
[NaSortMSLL,Index]=sort(NaMSLL);
aMSLL(i)=NaSortMSLL(1);
NaSortf=Na(:,Index);
af(:,i)=NaSortf(:,1);
end
%种群刷新
bf=initialization(NP,D,Xs',Xx');
bf = bf';
for np=1:NP/2
bMSLL=fobj(bf(:,np));
end
%免疫种群与新种群合并
f1=[af,bf];
MSLL = [aMSLL,bMSLL];
[SortMSLL,Index]=sort(MSLL);
Sortf=f1(:,Index);
gen=gen+1;
if SortMSLL(1) < fMin
fMin = SortMSLL(1);
Bestf = Sortf(:,1);
end
trace(gen)=fMin;
end
% Application of simple limits/bounds
function s = Bounds( s, c, d,dim)
% Apply the lower bound vector
Lb= c.*ones( dim,1 ); % Lower limit/bounds/ a vector
Ub= d.*ones( dim,1); % Upper limit/bounds/ a vector
temp = s;
I = temp < Lb;
temp(I) = Lb(I)+rand*(Ub(I)-Lb(I));
% Apply the upper bound vector
J = temp > Ub;
temp(J) = Lb(J)+rand*(Ub(J)-Lb(J));
% Update this new move
s = temp;
03结果展示
在CEC2005函数中测试结果如下:






评价
由CEC2005函数的测试中可以看到,标准免疫算法的实施效果并不太理想,且每次实验的结果差距还挺大。下一篇文章将对免疫算法进行改进。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)