智能优化方法之免疫算法
0. 概念与问题对应
抗原->待优化问题
抗体->问题可行解
个体浓度、免疫细胞与抗原的亲和度(抗体评价)->可行解质量
免疫选择、克隆、变异、克隆抑制、种群刷新->寻优搜索
<1> 基于欧式距离的抗体亲和度计算方法
a f f ( a b i , a b j ) = ∑ k = 1 L ( a b i , k − a b j , k ) 2 aff(ab_i,ab_j)=\sqrt{\sum_{k=1}^{L}(ab_{i,k}-ab_{j,k})^2} aff(abi,abj)=∑k=1L(abi,k−abj,k)2
式中, a b i , k ab_{i,k} abi,k表示可行解 i i i的第 k k k维; a b j , k ab_{j,k} abj,k表示可行解 j j j的第 k k k维; L L L表示可行解的总维数
<2> 抗体浓度评价算子
d e n ( a b i ) = 1 / N ∗ ∑ j = 1 N S ( a b i , a b j ) den(ab_i)=1/N*\sum_{j=1}^NS(ab_i,ab_j) den(abi)=1/N∗∑j=1NS(abi,abj)
式中, N N N为可行解规模, S ( a b i , a b j ) S(ab_i,ab_j) S(abi,abj)表示可行解之间的相似度,表示为
S ( a b i , a b j ) = { 1 a f f ( a b i , a b j ) < δ s 0 a f f ( a b i , a b j ) ≥ δ s S(ab_i,ab_j)=\begin{cases} 1&aff(ab_i,ab_j)<\delta_s\\ 0&aff(ab_i,ab_j)\geq\delta_s \end{cases} S(abi,abj)={10aff(abi,abj)<δsaff(abi,abj)≥δs
其中 a b i ab_i abi为可行解规模中的第 i i i个可行解, a f f ( a b i , a b j ) aff(ab_i,ab_j) aff(abi,abj)为可行解 i i i和可行解 j j j之间的亲和度; δ s \delta_s δs为相似度阈值
值得注意的是,抗体浓度计算是为了保证可行解的多样性以及全局搜索。
<3> 变异算子
描述为
T m ( a b i , j , m = { a b i , j , m + ( r a n d − 0.5 ) ∗ δ r a n d < p m a b i , j , m 其他 T_m(ab_{i,j,m}=\begin{cases} ab_{i,j,m}+(rand-0.5)*\delta & rand<p_m\\ ab_{i,j,m}&其他 \end{cases} Tm(abi,j,m={abi,j,m+(rand−0.5)∗δabi,j,mrand<pm其他
其中, a b i , j , m ab_{i,j,m} abi,j,m表示可行解 a b i ab_i abi 的第 m m m 个克隆体的第 j j j 维, δ \delta δ表示邻域的范围,这里的 δ \delta δ是需要非常值得注意的算法的早期阶段进行广泛的搜索,以便更好地探索解空间并找到全局最优解的大致位置。随着进化代数的增加,邻域范围逐渐缩小,以便在后续阶段更加集中和精确地搜索最优解的局部区域; p m p_m pm表示变异概率
<4> MATLAB代码
%%%%%%%%%%%%%%%%%免疫算法求函数最小值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
% close all; %清图
clc; %清屏
D=10; %免疫个体维数
NP=200; %免疫个体数目
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;
% deta=deta0;
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('亲和度进化曲线')
%%%%%%%%%%%%%%%%%%%%%%%%%亲和度函数%%%%%%%%%%%%%%%%%%%%%%
function result=func1(x)
summ=sum(x.^2);
result=summ;
end
1. 抗体浓度在问题求解中的作用
- 评估群体多样性:
抗体浓度可以反映抗体群体的多样性程度。较高的抗体浓度意味着抗体群体中存在更多的不同抗体,即多样性较高。这对于在问题的搜索空间中进行广泛的探索非常重要。高抗体浓度可以保持较高的多样性,避免陷入局部最优解,并提高发现全局最优解的可能性。
- 控制克隆操作:
免疫算法中的克隆操作会产生大量的克隆抗体。抗体浓度可以用于控制克隆操作的程度,即克隆抗体的数量。较高的抗体浓度会导致更多的克隆抗体产生,从而增加搜索空间的探索能力和多样性。通过调节抗体浓度,可以控制克隆操作的规模,适应问题的特性和求解需求。
- 调节进化过程:
抗体浓度还可以作为调节算法收敛性和多样性之间平衡的一项指标。在求解过程中,随着迭代的进行,抗体浓度可能会逐渐增加。当抗体浓度较低时,说明算法仍在探索空间的早期阶段,此时需要保持较高的多样性,以便更好地发现全局最优解。而当抗体浓度逐渐增加时,可能意味着算法已经找到了一些较优解,此时可以适度减少多样性,提高收敛性,以便更加精确地搜索局部最优解。通过动态调整抗体浓度,可以平衡算法的收敛速度和最终的求解精度
2. 为什么在变异以后要保留克隆源个体
- 提供备份:
克隆源个体可以看作是克隆变异操作的备份。如果后续的进化过程中产生的新个体无法达到预期的效果或不利于优化过程,可以随时回退到克隆源个体,从而提供一种退路或备选方案。这样可以避免因过早删除克隆源个体而导致优质个体的丢失。
- 支持进一步进化:
保留克隆源个体可以为后续的进化过程提供更多的选择和可能性。这些克隆源个体可能在后续的变异和选择操作中发挥重要作用,可能成为下一代中优秀个体的起点,对整个进化过程起到推动和引导的作用