代码如下:
(代码仅供参考,能运行,如有错误,欢迎留言);
clear;
close all;
tic;
%%%%%%%%%%%%%%%%%%%%%免疫算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%单目标多变量%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
limit = [-8,10;-4,10;2,10]; %变量范围
immunum = 50; %免疫个体数目
maxgen = 100; %最大免疫代数
clonum = 75; %克隆个数
changpro = 0.5; %变异概率
alfa = 1; %激励度系数
belta = 1; %激励度系数
detas = 0.2; %相似度阈值
cregen = 0; %当前迭代代数
virnum = size(limit,1); %免疫个体维数
%%%%%%%%%预定义%%%%%%%%%%%%%%%%%
newMSLL = zeros(1,immunum);
newf = rand(virnum,immunum);
f2 = rand(virnum,immunum/2);
f = rand(virnum,immunum);
bf = rand(virnum,immunum/2);
odist = zeros(1,immunum);
immucon = zeros(1,immunum);
cloboxMSLL = zeros(1,clonum);
aMSLL = zeros(1,immunum/2);
af = zeros(virnum,immunum/2);
aodist = zeros(1,immunum/2);
codist = zeros(1,immunum/2);
aimmucon = zeros(1,immunum/2);
bimmucon = zeros(1,immunum/2);
trace = zeros(1,maxgen);
%%%%%%%%%创建初始种群f%%%%%%%%%%%%%%%%%
for i = 1:1:virnum
f(i,:) = newf(i,:)*( limit(i,2)- limit(i,1)) + limit(i,1);
end
%%%%%%%%%计算f适应度%%%%%%%%%%%%%%%%%
for np=1:immunum
newMSLL(np) = fcn1(f(:,np));
end
%%%%%%%%%计算f个体浓度%%%%%%%%%%%%%%%%%
for np=1:immunum
for j=1:immunum
odist(j) = sum(sqrt((f(:,np)-f(:,j)).^2)); %亲和度,欧氏距离
if odist(j) < detas
odist(j)=1;
else
odist(j)=0;
end
end
immucon(np)=sum(odist)/immunum; %抗体浓度
end
%%%%%%%%%计算f激励度%%%%%%%%%%%%%%%%%
newMSLL = alfa*newMSLL - belta*immucon; %抗体激励度
%%%%%%%%%f排序%%%%%%%%%%%%%%%%%
[newSortMSLL,Index] = sort(newMSLL,'descend');
newSortf = f(:,Index);
%%%%%%%%%免疫循环%%%%%%%%%%%%%%%%%%
while cregen < maxgen
for i = 1:1:immunum/2
temppoi = newSortf(:,i);
clobox = repmat(temppoi,1,clonum);
for j = 2:1:clonum
for ii = 1:1:virnum
%变异
if rand > changpro
clobox(ii,j) = clobox(ii,j)+ ((0.6*rand(1,1)-0.3)*(limit(ii,2) - limit(ii,1)));
end
%边界条件处理
if ( clobox(ii,j) > limit(ii,2)) || (clobox(ii,j) < limit(ii,1) ) %如果变异数值超过边界
clobox(ii,j) = rand(1,1)*(limit(ii,2)-limit(ii,1))+limit(ii,1); %在范围内随机取数
end
end
end
%克隆抑制,保留亲和度最高个体
for j=1:clonum
cloboxMSLL(j) = fcn1(clobox(:,j));
end
[cloboxSortMSLL,Index] = sort(cloboxMSLL,'descend');
aMSLL(i) = clob