一、免疫知识
免疫:是机体的一种生理反应,当病原体(即抗原)进入人体时,这些抗原将刺激免疫细胞(淋巴B细胞、T细胞)产生一种抵抗该病原生物的特殊蛋白质——抗体。抗体能将该病原生物消灭,并在将病原生物消灭之后,仍存留在人体内。
二、免疫算法
1、算法理论
免疫算法是模仿生物免疫机制,结合基因的进化机理,人工构造出的一种新型智能优化算法。
2、算法特点
免疫算法利用自身产生多样性和维持机制的特点,保证了种群的多样性,克服了一般寻优过程(特别是多峰值的寻优过
程)中不可避免的“早熟”问题,可以求得全局最优解。免疫算法具有自适应性、随机性、并行性、全局收敛性、种群多样性等优点。
- 全局搜索能力:免疫算法在对优质抗体邻域进行局部搜
索的同时利用变异算子和种群刷新算子不断产生新个体 - 多样性保存机制:对抗体进行浓度计算,并将浓度计算的结果作为评价抗体个体优劣的一个重要标准;它使浓度高的抗体被抑制,保证抗体种群具有很好的多样性,这也是保证算法全局收敛性能的一个重要方面。
- 鲁棒性强:对问题和初始解的依赖性不强
- 并行分布式搜索机制:除找到问题的最佳解决方案外,还会得到若干较好的备选方案,尤其适合于多模态的优化问题。
3、免疫算法与生物免疫系统概念的对应关系
4、算法算子
(1)亲和度评价算子
亲和度表征免疫细胞与抗原的结合强度。函数的输入为一个抗体个体(可行解),输出即为亲和度评价结果。
(2)抗体浓度评价算子
抗体浓度表征抗体种群的多样性好坏。抗体浓度过高意味着种群中非常类似的个体大量存在,则寻优搜索会集中于可行解区间的一个区域,不利于全局优化。
- 抗体浓度定义为:
补:抗体间亲和度的计算方法
(3)激励度算子
抗体激励度是对抗体质量的最终评价结果,需要综合考虑抗体亲和度和抗体浓度,通常亲和度大、浓度低的抗体会得到较大的激励度。抗体激励度的计算通常可以利用抗体亲和度和抗体浓度的评价结果进行简单的数学运算得到。
(4)免疫选择算子
免疫选择算子根据抗体的激励度确定选择哪些抗体进入克隆选择操作。在抗体群中激励度高的抗体个体具有更好的质量,更有可能被选中进行克隆选择操作,在搜索空间中更有搜索价值。
(5)克隆算子
(6)变异算子
对克隆算子得到的抗体克隆结果进行变异操作,以产生亲和度突变,实现局部搜索,对算法的性能有很大的影响。
-
实数编码算法变异算子
-
离散编码算法变异算子
(7)克隆抑制算子
克隆抑制算子用于对经过变异后的克隆体进行再选择,抑制亲和度低的抗体,保留亲和度高的抗体进入新的抗体种群。在克隆抑制的过程中,克隆算子操作的源抗体与克隆体经变异算子作用后得到的临时抗体群共同组成一个集合,克隆抑制操作将保留此集合中亲和度最高的抗体,抑制其他抗体。
由于克隆变异算子操作的源抗体是种群中的优质抗体,而克隆抑制算子操作的临时抗体集合中又包含了父代的源抗体,因此在免疫算法的算子操作中隐含了最优个体保留机制。
(8)种群刷新算子
对种群中激励度较低的抗体进行刷新,从抗体种群中删除这些抗体并以随机生成的新抗体替代,有利于保持抗体的多样性,实现全局搜索,探索新的可行解空间区域。
5、算法种类(初学者无需过多关注)
(1)克隆选择算法
(2)免疫遗传算法
(3)反向选择算法
(4)疫苗免疫算法
6、算法流程
目前没有统一的免疫算法及框图,下面是一种有免疫算子的算法流程:
7、关键参数说明
- 抗体种群大小NP:抗体种群保留了免疫细胞的多样性,从直观上看,种群越大,免疫算法的全局搜索能力越好,但是算法每代的计算量也相应增大。在大多数问题中,NP 取10~100较为合适,一般不超过200。
- 免疫选择比例:免疫选择的抗体的数量越多,将产生更多的克隆,其搜索能力越强,但是将增加每代的计算量。一般可以取抗体种群大小NP的10%~50%。
- 抗体克隆扩增的倍数:克隆的倍数决定了克隆扩增的细胞的数量,从而决定了算法的搜索能力,主要是局部搜索能力。克隆倍数数值越大,局部搜索能力越好,全局搜索能力也有一定提高,但是计算量也随之增大,一般取5~10倍。
- 种群刷新比例:细胞的淘汰和更新是产生抗体多样性的重要机制,因而对免疫算法的全局搜索能力产生重要影响。每代更新的抗体一般不超过抗体种群的50%。
- 最大进化代数:最大进化代数G是表示免疫算法运行结束条件的一个参数,表示免疫算法运行到指定的进化代数之后就停止运行,并将当前群体中的最佳个体作为所求问题的最优解输出。一般G取100~500。
MATLAB仿真实例
1、问题
2、仿真过程
源程序
%%%%%%%%%%%%%%%%%%%%%%%%%亲和度函数%%%%%%%%%%%%%%%%%%%%%%
function result=func1(x)
summ=sum(x.^2);
result=summ;
%%%%%%%%%%%%%%%%%免疫算法求函数极值%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
D=10; %免疫个体维数
NP=100; %免疫个体数目
Xs=20; %取值上限
Xx=-20; %取值下限
G=500; %最大免疫代数
pm=0.7; %变异概率
alfa=1; %激励度系数
belta=1; %激励度系数
detas=0.2; %相似度阈值
gen=0; %免疫代数
Ncl=10; %克隆个数
deta0=1*Xs; %邻域范围初值
%%%%%%%%%%%%%%%%%%%%%%%初始种群%%%%%%%%%%%%%%%%%%%%%%%%
f=rand(D,NP)*(Xs-Xx)+Xx;
for np=1:NP
MSLL(np)=func1(f(:,np));
end
%%%%%%%%%%%%%%%%%计算个体浓度和激励度%%%%%%%%%%%%%%%%%%%
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,Ncl);
deta=deta0/gen;
for j=1:Ncl
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:Ncl
NaMSLL(j)=func1(Na(:,j));
end
[NaSortMSLL,Index]=sort(NaMSLL);
aMSLL(i)=NaSortMSLL(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/2;
end
aMSLL = alfa*aMSLL- belta*aND;
%%%%%%%%%%%%%%%%%%%%%%%种群刷新%%%%%%%%%%%%%%%%%%%%%%%
bf=rand(D,NP/2)*(Xs-Xx)+Xx;
for np=1:NP/2
bMSLL(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
bMSLL = alfa*bMSLL- belta*bND;
%%%%%%%%%%%%%%免疫种群与新生种群合并%%%%%%%%%%%%%%%%%%%
f1=[af,bf];
MSLL1=[aMSLL,bMSLL];
[SortMSLL,Index]=sort(MSLL1);
Sortf=f1(:,Index);
gen=gen+1;
trace(gen)=func1(Sortf(:,1));
end
%%%%%%%%%%%%%%%%%%%%%%%输出优化结果%%%%%%%%%%%%%%%%%%%%%%%%
Bestf=Sortf(:,1); %最优变量
trace(end); %最优值
figure,plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('亲和度进化曲线')
源自《智能优化算法及其MATLAB实例(第2版)》