📄 wether_bak2.m
字号:
% 本程序是基于人工免疫原理的天气预报系统的MATLAB实现程序
% 用于免疫系统的学习训练
% 具体算法请参考该文献
% 易世华2006年3月15日
tic %计时开始
clc
clear
load data1
a=10; %定义克隆率
beta=0.2; %定义变异概率
resource=500; %定义系统总资源
sita=0.6; %定义刺激阈值
agnor=1/sqrt(12)*ag(:,1:12);
n=size(ag,1);
%计算整个抗原集合的亲和力平均值d
d=0;
for i=1:n-1
for j=i+1:n
d=d+sqrt((agnor(i,:)-agnor(j,:))*(agnor(i,:)-agnor(j,:))');
end
end
d=d*2/(n*(n-1))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%免疫学习系统
B=zeros(50,17,8); %初始化B细胞集合
M=zeros(15,17,8); %初始化M细胞集合
nb=zeros(1,8);
nm=nb;
zero=zeros(1,17);
for i=1:n %第i个抗原
%(1)克隆选择过程
c=ag(i,13)*4+ag(i,14)*2+ag(i,15)+1;%计算抗原(B、M细胞)的类别c
if sum(sum(M(:,1:15,c)))
for j=1:nm(c)
M(j,16,c)=1-sqrt((M(j,1:12,c)-agnor(i,:))*(M(j,1:12,c)-agnor(i,:))');
end
[m num]=max(M(:,16,c));
mclone=M(num,1:15,c);
clonen=a*m;
else
mclone=[agnor(i,:),ag(i,13:15)];
nm(c)=nm(c)+1;
M(nm(c),1:15,c)=mclone;
clonen=a;
end
for j=1:clonen %对记忆细胞进行克隆
rate=rand;
if rate>beta
muta=mutate(mclone); %对抗原的特征向量和类别进行变异
c2=muta(13)*4+muta(14)*2+muta(15)+1;
nb(c2)=nb(c2)+1;
B(nb(c2),1:15,c2)=muta;
B(nb(c2),16,c2)=1-sqrt((muta(1:12)-agnor(i,:))*(muta(1:12)-agnor(i,:))');
if c2~=c
B(nb(c2),16,c2)=B(nb(c2),16,c2)*0.8;%与抗原相同类别的B细胞具有更高的刺激值,同时分配更多的资源
end
B(nb(c2),17,c2)=B(nb(c2),16,c2)*a;
end
end
nb(c)=nb(c)+1;
B(nb(c),1:15,c)=mclone;
B(nb(c),16,c)=1-sqrt((mclone(1:12)-agnor(i,:))*(mclone(1:12)-agnor(i,:))');
B(nb(c),17,c)=B(nb(c),16,c)*a;
%(2)动态演化
si=0;
while si~=100 %while
for c2=1:8 %资源竞争算法
A=sum(B(:,17,c2));
b1=sum(sum(B(:,16,:))); %待改进
b2=resource*sum(B(:,16,c2))/b1;
while A>b2
[m,num]=min(B(1:nb(c2),16,c2));
B(num,:,c2)=B(nb(c2),:,c2);
B(nb(c2),:,c2)=zero;
nb(c2)=nb(c2)-1;
A=A-m*a;
end
end
for num=1:4 %随机选4个B细胞再次进行克隆选择
c2=ceil(8*rand);
while nb(c2)==0
c2=ceil(8*rand);
end
j=ceil(nb(c2)*rand);
mclone2=B(j,1:15,c2);
clonen=a*B(j,16,c2);
for j=1:clonen
rate=rand;
if rate>beta
muta=mutate(mclone2);
c2=muta(13)*4+muta(14)*2+muta(15)+1;
nb(c2)=nb(c2)+1;
B(nb(c2),1:15,c2)=muta;
B(nb(c2),16,c2)=1-sqrt((muta(1:12)-agnor(i,:))*(muta(1:12)-agnor(i,:))');
if c2~=c
B(nb(c2),16,c2)=B(nb(c2),16,c2)*0.8;%与抗原相同类别的B细胞具有更高的刺激值,同时分配更多的资源
end
B(nb(c2),17,c2)=B(nb(c2),16,c2)*a;
end
end
end
for c2=1:8 %动态演化过程结束条件
if nb(c2)==0
continue;
end
si=sum(B(:,16,c2))/nb(c2);
if si>sita
si=100;
break;
end
end
end %while
%(3)生成记忆细胞
[m,num]=max(B(1:nb(c),16,c));
mcand=B(num,1:15,c);
nm(c)=nm(c)+1;
M(nm(c),1:15,c)=mcand;
affinity=sqrt((mcand(1:12)-mclone(1:12))*(mcand(1:12)-mclone(1:12))');
if affinity<d/4
% [m,num]=min(M(1:nm(c),16,c));
% M(num,:,c)=M(nm(c),:,c);
% M(nm(c),:,c)=zero;
% nm(c)=nm(c)-1;
% for j=1:nm(c)
% if sum(M(j,1:15,c)-mclone)==0
% M(j,:,c)=B(nm(c),:,c);
% M(nm(c),:,c)=zero;
% nm(c)=nm(c)-1;
% end
% end
end
end
%免疫学习系统结束
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
save data2 M nm ag agnor n %保存训练所得数据
toc %计时结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -