免疫优化算法及其实现

一、在生物免疫学的基础上,生物免疫系统的运行机制与遗传算法的求解的很类似的。
将所求目标函数及约束条件当作抗原,问题的解当作抗体,那么遗传算法的求解过程其实就是生物免疫系统抵御抗原的过程。
求解问题及当作于各种各样的抗原,可以提前注射疫苗来抑制退化问题,从而保持优胜劣汰的特点,达到免疫的目的。

主函数
% 二维人工免疫优化算法
% m--抗体规模
% n--每个抗体二进制字符串长度
% mn--从抗体集合里选择n个具有较高亲和度的最佳个体进行克隆操作
% A--抗体集合(m×n),抗体的个数为m,每个抗体用n个二进制编码(代表参数)
% T--临时存放克隆群体的集合,克隆规模是抗原亲和度度量的单调递增函数
% FM--每代最大适应度值集合
% FMN--每代平均适应度值集合
% AAS--每个克隆的最终下标位置
% BBS--每代最优克隆的下标位置
% Fit--每代适应度值集合
% tnum--迭代代数
% xymin--自变量下限
% xymax--自变量上限
% pMutate--高频变异概率
% cfactor--克隆(复制)因子
% Affinity--亲和度值大小顺序
%%%%%%%%%%%%%%%%%%
clear all
clc
tic;
m=65;
n=22;
mn=60;
xmin=-10; 
xmax=10;
tnum=100;
pMutate=0.1;
cfactor=0.3;
A=InitializeFun(m,n); %生成抗体集合A,抗体数目为m,每个抗体基因长度为n
F='X+5*sin(X.*8)+7*cos(X.*3)'; **

## %目标函数****目标求解方程

**
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,xmax]); 
        grid on
        hold on
        plot(X,Fit,'k*')
        title('抗体的初始位置分布图')
        xlabel('x')
        ylabel('f(x)')
    end
    if t==tnum
        figure(2)
        fplot(F,[xmin,xmax]);
        grid on
        hold on
        plot(X,Fit,'r*')
        title('抗体的最终位置分布图')
        xlabel('x')
        ylabel('f(x)')
    end
    %把零时存放抗体的集合清空
    T=[]; 
    %把第t代的函数值Fit按从小到大的顺序排列并存放到FS中
    [FS,Affinity]=sort(Fit,'ascend'); 
    %把第t代的函数值的坐标按从小到大的顺序排列并存放到XT中
    XT=X(Affinity(end-mn+1:end)); 
     %从FS集合中取后mn个第t代的函数值按原顺序排列并存放到FT中
    FT=FS(end-mn+1:end);
    %把第t代的最优函数值加到集合FM中
    FM=[FM FT(end)]; 
    %克隆(复制)操作,选择mn个候选抗体进行克隆,克隆数与亲和度成正比,
    %AAS是每个候选抗体克隆后在T中的开始坐标
    [T,AAS]=ReproduceFun(mn,cfactor,m,Affinity,A,T);
    %把以前的抗体保存到临时克隆群体T里
    T=Hypermutation(T,n,pMutate,xmax,xmin); 
    %从大到小重新排列要克隆的mn个原始抗体
    AF1=fliplr(Affinity(end-mn+1:end)); 
    %把以前的抗体保存到临时克隆群体T里%从临时抗体集合T中根据亲和度的值选择mn个
    T(AAS,:)=A(AF1,:); 
    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)]=max(Fit(AAS(i)+1:AAS(i+1))); 
        BBS(i)=BBS(i)+AAS(i);
    end
    %从大到小重新排列要克隆的mn个原始抗体
    AF2=fliplr(Affinity(end-mn+1:end)); 
    %选择克隆变异后mn个子群中的最好个体保存到A里,其余丢失
    A(AF2,:)=T(BBS,:); 
end
disp(sprintf('\n The optimal point is:'));
disp(sprintf('\n x: %2.4f, f(x):%2.4f',XT(end),FM(end)));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure(3)
grid on 
plot(FM)
title('适应值变化趋势')
xlabel('迭代数')
ylabel('适应值')
hold on
plot(FMN,'r')
hold off

function X=DecodeFun(A,xmin,xmax)
A=fliplr(A); %左右翻转矩阵A
SA=size(A);
AX=0:1:21;
AX=ones(SA(1),1)*AX;
SX=sum((A.*2.^AX)');
X=xmin+(xmax-xmin)*SX./4194303;
end

%变异算子
function T=Hypermutation(T,n,pMutate,xmax,xmin)
M=rand(size(T,1),n)<=pMutate;
M=T-2.*(T.*M)+M;
k=round(log(10*(xmax-xmin)));
k=1;
T(:,k:n)=M(:,k:n);
end

function A=InitializeFun(m,n)
A=2.*rand(m,n)-1;
A=hardlim(A);
end

%克隆算子
function [T,AAS]=ReproduceFun(mn,cfactor,m,Affinity,A,T);
if mn==1
    CS=m;
    T=ones(m,1)*A(Affinity(end),:);
else
    for i=1:mn
        %每个抗体的克隆数与它和抗原的亲和度成正比%
        CS(i)=round(cfactor*m);
        %计算每个抗体的克隆数目CS(i)
        AAS(i)=sum(CS); 
        %每个抗体克隆的最终下标位置
        ONECS=ones(CS(i),1); 
        %生成CS(i)行1列单位矩阵ONECS
        subscript=Affinity(end-i+1); 
        %确定当前要克隆抗体在抗体集A中的下标
        AA=A(subscript,:); 
        %确定当前要克隆抗体的基因序列集合AA(1×n)
        T=[T;ONECS*AA]; 
        %得到零时存放抗体的集合T
    end
end

猜你喜欢

转载自blog.csdn.net/Azuresmh/article/details/86661161
今日推荐