⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gia.m

📁 改进的二进制编码免疫算法,主要改进的是免疫记忆库
💻 M
字号:
function [bestever,bPop,memory,Found,endAnti,traceInfo]=gia(memory,popsize,bounds,evalFN,evalOps,...
    maxgen,maxrunnum,precision,maxmemnum,pcross,pmutation,selectOps,startanti)
%二进制编码免疫算法
%function [bestever,bPop,memory,Found,endAnti,traceInfo]=gia(memory,popsize,bounds,evalFN,evalOps,...
%    maxgen,maxrunnum,precision,maxmemnum,pcross,pmutation,selectOps,startanti)
%
%   输入参数
%   1.memory      ——  算法导入的免疫抗体记忆库
%   2.popsize     ——  进化的抗体群大小
%   3.bounds      ——  问题定义的变量值域,如果问题有N个变量,则其为N×2的矩阵,第一列为下边界,第二列为上边界
%   4.evalFN      ——  适应度计算函数,反应了问题的求解方向
%   5.evalOps     ——  适应度计算的参数
%   6.maxgen      ——  算法运行一次运算的进化的代数
%   7.maxrunnum   ——  算法运行的最大运算次数
%   8.precision   ——  问题编码精度,本算法采用按精度要求在变量值域内进行编码
%   9.maxmemnum   ——  记忆分化模块中最大的记忆抗体记忆数目
%  10.pcross      ——  交差操作时采用的交叉率
%  11.pmutation   ——  变异操作时采用的变异率
%  12.selectOps   ——  选择操作时采用的参数,包括两项[CLimit,Alphi]
%  13.startanti   ——  初始抗体群
%
%   输出参数
%   bestever    ——  求得的最佳解的变量值,极其对应的适应度值,为N+1维的向量
%   bPop        ——  迭代得到的更优抗体的记录,为N+3列的矩阵,对应的,第一列是算法运行的次数,第二列是算法每次运行中的代数,N+3列为适应度值
%   memory      ——  更新后的免疫抗体记忆库
%   Found       ——  更新后的免疫抗体记忆库对应所求问题的标签
%   endAnti     ——  算法运行到最后的一代抗体群的二进制编码序列和对应的适应度值
%   traceInfo   ——  算法运行的轨迹信息

%设置默认输入参数
n=nargin;
if(n<1),
    memory={};
end
if(n<2),
    popsize=40; 
end
if(n<3),
    bounds=[-10,10;-10,10];
end
if(n<4),
    evalFN='SphereEval';
end
if(n<5),
    evalOps=[];
end
if(n<6),
    maxgen=100;
end
if(n<7),
    maxrunnum=1;
end
if(n<8),
    precision=1e-4;
end
if(n<9),
    maxmemnum=3;
end
if(n<10),
    pcross=0.6;
end
if(n<11),
    pmutation=0.05;
end
if(n<12),
    selectOps=[0.9 0.7];
    %抗体促进与抑制过程中用到参数CLimit,alphi
end
if(n<13),
    startanti=[];
end

%初始化全局变量

bits=caculatebits(precision,bounds);%编码位串
done=0;%设置结束标志为非
num=0;%设置次数计数位为1
gen=1; %设置代数计数位为1
oval=0;%初始化最大适应度值
bFoundIn=1;%设置bval中下一个最佳个体信息保留位置的指针

%1抗原识别
[Found]=antigenFound2(memory,bounds,evalFN,precision);

%2初始种群生成
if popsize~=size(startanti,1),
    startanti=initializeAnti5(popsize,memory,Found,bits);
end

%如果不满足结束条件进行免疫算法进化操作
while(~done)
    gendone=0;%设置每次结束标记为非
    if(num>0),
       startanti=initializeAnti5(popsize,memory,Found,bits);
    end
    while(~gendone)
        %3计算适应度值
        valmat=valCalculate(startanti,bounds,evalFN,evalOps,precision);
    
        %计算当前群体中的最优个体得bestever
        [bval,bindx] = max(valmat); 
    
        %保存当前代信息到traceInfo(num*maxgen+gen,:)中
        if nargout>=6,
            traceInfo(num*maxgen+gen,1)=num+1;                             %当前运行的次数
            traceInfo(num*maxgen+gen,2)=gen; 		                       %当前代数
            traceInfo(num*maxgen+gen,3)=valmat(bindx);                     %最佳适应度
            traceInfo(num*maxgen+gen,4)=mean(valmat);                      %平均适应度
            traceInfo(num*maxgen+gen,5)=std(valmat);                       %适应度标准差
        end
    
        %如果有更优解则更新bval
        if ((bval>oval) | (gen==1))         
            bPop(bFoundIn,:)=[num+1 gen b2f2(startanti(bindx,:),bounds,bits) valmat(bindx)];
            bFoundIn=bFoundIn+1;                     
            oval=bval;
        end
    
        %4向记忆细胞分化
        [memory,Found]=wMemory8(startanti,valmat,bounds,evalFN,precision,...
            memory,Found,maxmemnum);
    
        %5抗体的促进和抑制
        if selectOps(2)~=1,
            Pc=caculatepc2(startanti,selectOps(1));
            Pf=calculatePf(valmat);
            P=calculateP(Pc,Pf,selectOps(2));
            newanti = rouletteSelect(startanti,P);
        else
            Pf=calculatePf(valmat);
            newanti = rouletteSelect(startanti,Pf);
        end   
        %6交叉
        newanti = singlePopCross(newanti,pcross);
    
        %二进制变异
        [newanti] = biPopMutate(newanti,pmutation);
    
        %将记忆细胞加入下一代的更新中,替换掉当前个体与记忆细胞最相似的个体
        [newanti] = memcellAdd2(newanti,memory,Found,bounds,evalFN,evalOps,precision);
    
        %如果不满足结束条件进入下一代
        gen=gen+1;
        if(gen>=maxgen),
            gendone=1;
            num=num+1;
        end
        startanti=newanti;
    end

    %计算最后一代群体中的最优个体得bestever
    valmat=valCalculate(startanti,bounds,evalFN,evalOps,precision);
    [bval,bindx] = max(valmat);               
    
    %保存当前代信息到traceInfo(num*maxgen+gen,:)中
    if nargout>=6,
        traceInfo((num-1)*maxgen+gen,1)=num;                             %当前运行的次数
        traceInfo((num-1)*maxgen+gen,2)=gen; 		                       %当前代数
        traceInfo((num-1)*maxgen+gen,3)=valmat(bindx);                     %最佳适应度
        traceInfo((num-1)*maxgen+gen,4)=mean(valmat);                      %平均适应度
        traceInfo((num-1)*maxgen+gen,5)=std(valmat);                       %适应度标准差
    end
    %如果是更优解则更新bval
    if ((bval>oval)| (gen==1))
        bPop(bFoundIn,:)=[num gen b2f2(startanti(bindx,:),bounds,bits) valmat(bindx)];
        bFoundIn=bFoundIn+1;                     
        oval=bval;
    end
    %4向记忆细胞分化
    [memory,Found]=wMemory8(startanti,valmat,bounds,evalFN,precision,...
        memory,Found,maxmemnum);
    gen=1;
    if(num>=maxrunnum),
        done=1;
    end
end   
bestever=bPop(bFoundIn-1,3:size(bPop,2));
endAnti=[startanti valmat'];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -