📄 gia.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 + -