免疫算法简介

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

3dd9ed40bb0c8f05dd1daaa1ca3a62e6.png

01算法原理

算法流程图:

8e1b2bca8e9e2dd5a5a78d6db068fd4a.png

流程介绍:

(1)初始化免疫算法参数;

(2)随机产生初始种群,计算个体亲和度、抗体浓度和激励度,并按激励度排序;

(3)取激励度前 NP/2个个体进行克隆、变异、克隆抑制的免疫操作,免疫后的种群进行激励度计算;

(4)随机生成 NP/2个个体的新种群,并计算个体亲和度、抗体浓度和激励度;免疫种群和随机种群合并,按激励度排序,进行免疫迭代;

(5)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值;若不满足,则继续进行迭代优化。

关于原理介绍本文就不再细讲:大家可以参考这篇文章,写的很详细。免疫算法及MATLAB入门实例 - 知乎 (zhihu.com)

30bcce6963d8906d4cc1c3f6bba7f9ca.png

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函数中测试结果如下:

5db9353c0481d96011c9ce8091ba3896.png

03a97f189107fbd2f6642cdb5838c76b.png

8fe37d6507c040d60d85dae1763cf167.png

d07252fd883754536256a723b4af0a2b.png

4448e285dfac1b0b72a6748ac2b694d3.png

97c2b99ccc7402689493fbe62b4653b8.png

评价


由CEC2005函数的测试中可以看到,标准免疫算法的实施效果并不太理想,且每次实验的结果差距还挺大。下一篇文章将对免疫算法进行改进。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐