免疫算法(Immune Algorithm,IA)实例详解

免疫算法是将免疫概念及其理论应用于遗传算法,在保留原算法优良特性的前提下,利用抗体浓度评价算子和激励度计算算子来保持群体的多样性,克服了一般寻优过程中(特别是多峰值)不可避免的“早熟”问题。

1 算法概念

免疫算法是受生物免疫系统的启发而推出的一种新型的智能搜索算法。 

2 主要特点

全局搜索能力

多样性保持机制

鲁棒性强

并行分布式搜索机制

3 算法流程

3.1 产生初始抗体种群

基于概率随机生成。

3.2 计算亲和度

依据函数值或函数值的简单处理(倒数、相反数),亲和度表示为aff。

3.3 计算抗体浓度和激励度

抗体浓度表征抗体种群的多样性好坏,浓度高代表种群相似大量存在,抗体浓度表示为den。

有3中方法计算浓度:基于欧式距离、基于海明距离、基于信息熵。

激励度是对抗体质量的最终评价结果,通常通过对抗体亲和度aff和抗体浓度den进行简单数学运算得到,激励度sim=a*aff-b*den,其中a,b为计算参数。

3.4 免疫处理

免疫选择,选择亲和度靠前的部分进行免疫处理,一般取前NP/2,使其活化。

克隆,对活化的抗体进行克隆复制。

变异,对克隆副本进行变异操作,保留被克隆抗体,主要针对亲和度。

克隆抑制,对变异结果进行筛选,保留亲和度高的变异结果。

3.5 种群刷新

随机生成部分新的抗体种群,与免疫处理的抗体合并,形成新一代抗体。

4 关键参数

4.1 抗体种群大小NP

取10-100合适,一般不超过200。

4.2 免疫选择比例

一般取NP规模的10%-50%。

4.3 抗体克隆扩增的倍数NC

倍数越大,局部搜索能力越好,但计算量增加,一般取5-10倍。

4.4 最大进化代数G

一般取100-500。

5 仿真实例

5.1 问题描述

TSP-旅行商问题,假如一个商人需要拜访31个省会城市,每个城市只能拜访1次,求拜访的最小路径。

5.2 求解代码

5.2.1 创建初始免疫种群

%%%%%初始化参数
C = [1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;
    3238 1229;4196 1044;4312 790 ;4386 570 ;3007 1970;2562 1756;
    2788 1491;2381 1676;1332 695 ;3715 1678;3918 2179;4061 2370;
    3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;
    3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;
    2370 2975];
NP=200;
N=size(C,1);
G=1000;
%%%%%初始种群
f=zeros(N,NP);
for i=1:NP
    f(:,i)=randperm(N);
end

5.2.2 亲和度计算

len=zeros(1,NP);
%%%%%任意城市间距离
D=zeros(N);
for i=1:N
    for j=1:N
        D(i,j)=((C(i,1)-C(j,1))^2 + (C(i,2)-C(j,2))^2)^0.5;
    end
end
%%%%%计算路径长度--亲和度
for i=1:NP
    len(i)=func3(D,f(:,i),N);
end
[sortlen ,index]=sort(len);
sortf=f(:,index);
NC=10;
%%%%%路径长度函数
function result = func3(D,f,N)
    len=D(f(1),f(N));
    for j=2:N
        len=D(f(j),f(j-1))+len;
    end
    result=len;
end

5.2.3 免疫操作

gen=1;
%%%%%免疫循环
while gen<=G
    %%%%%选择激励度前NP/2个体进入免疫操作
    for i=1:NP/2
        a=sortf(:,i);
        ca=repmat(a,1,NC);
        for j=1:NC
            p1=floor(1+N*rand);
            p2=floor(1+N*rand);
            while p1==p2
                p1=floor(1+N*rand);
                p2=floor(1+N*rand);
            end
            tmp=ca(p1,j);
            ca(p1,j)=ca(p2,j);
            ca(p2,j)=tmp;
        end
        ca(:,1)=a;
        %%%%%克隆抑制
        for j=1:NC
            calen(j)=func3(D,ca(:,j),N);
        end
        [sortcalen,index]=sort(calen);
        sortca=ca(:,index);
        af(:,i)=sortca(:,1);
        alen(i)=sortcalen(1);
    end

5.2.4 种群刷新

 %%%%%免疫种群与新生种群合并--种群刷新
    for i=1:NP/2
        bf(:,i)=randperm(N);
        blen(i)=func3(D,bf(:,i),N);
    end
    f=[af bf];
    len=[alen blen];
    [sortlen, index]=sort(len);
    sortf=f(:,index);
    gen=gen+1;
    trace(gen)=sortlen(1);
end

5.2.5 结果输出

%%%%%输出优化结果
figure;
bestf=sortf(:,1);
bestlen=trace(end);
for i=1:N-1
    plot([C(bestf(i),1),C(bestf(i+1),1)],[C(bestf(i),2),C(bestf(i+1),2)],'o-');
    hold on;
end
plot([C(bestf(N),1),C(bestf(1),1)],[C(bestf(N),2),C(bestf(1),2)],'ro-');
title(['最短距离:',num2str(bestlen)]);
figure;
plot(trace);
xlabel('迭代次数');
ylabel('目标函数值');
title('亲和度进化曲线');

5.3 问题结果

图3 亲和度进化曲线 

图4 最短路径行程

用matlab编写的人工免疫算法 clc clear all close all tic; global n ww m=100;% m--抗体规模 n=22;% n--每个抗体二进制字符串长度 ww=1;%参数个数 mn=100;%从抗体集合里选择n个具有较高亲和度的最佳个体进行克隆操作 xmin=[0 0]; xmax=[9 9]; tnum=100;% tnum--迭代代数 pMutate=0.1;% pMutate--高频变异概率 cfactor=0.2;% cfactor--克隆(复制)因子 A=InitializeFun(m,n); %生成抗体集合A,抗体数目为m,每个抗体基因长度为n F='X+10*sin(X.*5)+7*cos(X.*4)'; %目标函数 %F='sin(10*X)' FM=[]; %存放各代最优值的集合 FMN=[]; %存放各代平均值的集合 t=0; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% while t<tnum t=t+1; X=DecodeFun(A(:,1:22),xmin,xmax); %将二进制数转换成十进制数 Fit=eval(F); %以X为自变量求函数值并存放到集合Fit中 if t==1 figure(1) fplot(F,[xmin(1),xmax(1)]); grid on hold on plot(X,Fit,'k*') title('抗体的初始位置分布图') xlabel('x') ylabel('f(x)') end if t==tnum figure(2) fplot(F,[xmin(1),xmax(1)]); grid on hold on plot(X,Fit,'r*') title('抗体的最终位置分布图') xlabel('x') ylabel('f(x)') end T=[]; %把零时存放抗体的集合清空 [FS,Affinity]=sort(Fit,'descend'); %把第t代的函数值Fit按从小到大的顺序排列并存放到FS中 XT=X(Affinity(end-mn+1:end)); %把第t代的函数值的坐标按从小到大的顺序排列并存放到XT中 FT=FS(end-mn+1:end); %从FS集合中取后mn个第t代的函数值按原顺序排列并存放到FT中 FM=[FM FT(end)]; %把第t代的最优函数值加到集合FM中 %克隆(复制)操作,选择mn个候选抗体进行克隆,克隆数与亲和度成正比,AAS是每个候选抗体克隆后在T中的开始坐标 [T,AAS]=ReproduceFun(mn,cfactor,m,Affinity,A,T); %高频变异操作,变异概率反比于抗体的亲和度 T=Hypermutation(T,n,pMutate,xmax,xmin); %把以前的抗体保存到临时克隆群体T里 AF1=fliplr(Affinity(end-mn+1:end)); %从大到小重新排列要克隆的mn个原始抗体 T(AAS,:)=A(AF1,:); %把以前的抗体保存到临时克隆群体T里%从临时抗体集合T中根据亲和度的值选择mn个(多峰函数的解决) X=DecodeFun(T(:,1:22),xmin,xmax); Fit=eval(F); AAS=[0 AAS]; FMN=[FMN mean(Fit)]; for i=1:mn [OUT(i),BBS(i)]=min(Fit(AAS(i)+1:AAS(i+1))); %克隆子群中的亲和度最大的抗体被选中 BBS(i)=BBS(i)+AAS(i); end AF2=fliplr(Affinity(end-mn+1:end)); %从大到小重新排列要克隆的mn个原始抗体 A(AF2,:)=T(BBS,:); %选择克隆变异后mn个子群中的最好个体保存到A里,其余丢失 end disp(sprintf('\n The optimal point is:')); disp(sprintf('\n x: %2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NPC_0001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值