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

📄 新建 文本文档.txt

📁 这是一个免疫算法中基于疫苗算法的程序,里面有很多的程序注解,可以通俗而又方便的看到,并且快速的了解和运行
💻 TXT
字号:
免疫算法中基于疫苗算法的程序,
% 编程
%初始化(编码)
% initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度)
%Name: initpop.m
function pop=initpop(popsize,chromlength) 
pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为 {0,1} 行数为popsize,列数为chromlength的矩阵
% round对矩阵的每个单元进行圆整,这样产生的初始种群

%计算目标函数值
%将二进制数转化为十进制数(1)
%Name: decodebinary.m
%产生 [2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制
function pop2=decodebinary(pop)
[px,py]=size(pop); %求pop行和例数
for i=1:py
pop1(:,i)=2.^(py-1).*pop(:,i);
py=py-1;
end
pop2=sum(pop1,2); %求pop1的每行之和
%将二进制编码转化为十进制数(2)
% decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置
%Name: decodechrom.m
%将二进制编码转换成十进制
function pop2=decodechrom(pop,spoint,length)
pop1=pop(:,spoint:spoint+length-1);
pop2=decodebinary(pop1);
%计算目标函数值
% calobjvalue.m函数的功能是实现目标函数的计算
%Name: calobjvalue.m
%实现目标函数的计算
function [objvalue]=calobjvalue(pop)
temp1=decodechrom(pop,1,10); %将pop每行转化成十进制数
x=temp1*10/1023; %将二值域 中的数转化为变量域的数
objvalue=10*sin(5*x)+7*cos(4*x); %计算目标函数值

%计算群体中每个个体的亲和力
%S为自体抗体集合,S1为新采集到的抗原
%t为亲和力强度
%Name:calfitvalue.m
function fitvalue=calfitvalue(objvalue)
S= code;
S1= Unnoralcode;
sum=0;
for i=1:4
for j=1:12
sum+=(S1+S[i,j])^2;
end
end
for i=1:4
t=sqrt(sum);%计算抗原和抗体的结合强度
fitvalue=1/(1+t);%计算亲和力
end

% 选择
% 选择是决定哪些个体可以进入下一代
%a为删除系数,rthreshold为亲和力阀值
%Name: selection.m
Global sgn p D;
function [newpop]=selection(pop,fitvalue)
a=0.7;
rthreshold=0.3;
for i=1:4
if fitvalue> rthreshold 
sgn=1;
  else
sgn=0;
end
p=sum(sgn(fitvalue)/4;%计算亲和力的概率
D=a*(1-p)*4; %计算要删除的自抗体数目
newpop=D*(1-p)/p;

%交叉
%交叉(crossover),群体中的每个个体之间都以一定的概率 pc 交叉,即两个个体从各自字符串的某一位置
%(一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。例如,假设2个父代个体x1,x2为:
% x1=0100110
% x2=1010001
% 从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为:
% y1=0100001
% y2=1010110
% 这样2个子代个体就分别具有了2个父代个体的某些特征。利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。
%免疫算法子程序
%Name: crossover.m
function [newpop]=crossover(pop,pc)
[px,py]=size(pop);
newpop=ones(size(pop));
for i=1:2:px-1
if(rand<pc)
cpoint=round(rand*py);
newpop(i)=[pop(i,1:cpoint) pop(i+1,cpoint+1:py)];
newpop(i+1)=[pop(i+1,1:cpoint) pop(i,cpoint+1:py)];
else
newpop(i)=pop(i);
newpop(i+1)=pop(i+1);
end
end

%变异
%变异(mutation),基因的突变普遍存在于生物的进化过程中。变异是指父代中的每个个体的每一位都以概率 pm 翻转,即由“1”变为“0”, 或由“0”变为“1
%Name: mutation.m
function [newpop]=mutation(pop,pm)
[px,py]=size(pop);
newpop=ones(size(pop));
for i=1:px
if(rand<pm)
mpoint=round(rand*py);
if mpoint<=0
mpoint=1;
end
newpop(i)=pop(i);
if any(newpop(i,mpoint))==0
newpop(i,mpoint)=1;
else
newpop(i,mpoint)=0;
end
else
newpop(i)=pop(i);
end
end
% 求群体中亲和力强度最大的个体及其值
%Name: best.m
function [bestindividual,bestfit]=best(pop,fitvalue)
bestindividual=pop(1);
bestfit=fitvalue(1);
for i=2:4
if fitvalue(i)>bestfit
bestindividual=pop(i);
bestfit=fitvalue(i);
end
end

%主程序
%Name:genmain.m
clear all;
global popsize length min max N M code pc pm;
N=12; % 每个染色体段数(十进制编码位数)
M=20; % 进化代数
popsize=20; %设置初始参数,群体大小
length=10; % length为每段基因的二进制编码位数
chromlength=N*length; %字符串长度(个体长度),染色体的二进制编码长度
pc=0.7; %设置交叉概率
pm=0.3; %设置变异概率
bound={-100*ones(popsize,1),zeros(popsize,1)};min=bound{1};max=bound{2};
pop=initpop(popsize,chromlength); %运行初始化函数,随机产生初始群体
ymax=500;K=1;

%齿轮箱:4种故障类型编码,每一行为一种!code(1,:),齿面磨损;code(2,:),断齿;code(3,:),轴承内圈点蚀;code(4,:),轴弯曲
code =[-0.8180 -1.6201 -14.8590 -17.9706 -24.0737 -33.4498 -43.3949 -53.3849 -63.3451 -73.0295 -79.6806 -74.3230
-0.7791 -1.2697 -14.8682 -26.2274 -30.2779 -39.4852 -49.4172 -59.4058 -69.3676 -79.0657 -85.8789 -81.0905
-0.8571 -1.9871 -13.4385 -13.8463 -20.4918 -29.9230 -39.8724 -49.8629 -59.8215 -69.4926 -75.9868 -70.6706

];
%实际故障测得数据编码,这里设为断齿
Unnoralcode=[-0.8864 -2.2743 -12.2676 -11.6813 -18.5298 -27.9828 -37.9340 -47.9246 -57.8820 -67.5433 -73.9248 -68.9759];

for i=1:4 % 4种故障模式,每种模式应该产生 popsize 种监测器(抗体),每种监测器的长度和故障编码的长度相同
for k=1:M
[objvalue]=calobjvalue(pop,i); %计算目标函数
fitvalue=calfitvalue(objvalue); favg(k)=sum(fitvalue)/popsize; %计算群体中每个个体的亲和力
[newpop]=selection(pop,fitvalue); objvalue=calobjvalue(newpop,i); %选择
[newpop]=crossover(newpop,pc); objvalue=calobjvalue(newpop,i); %交叉
[newpop]=mutation(newpop,pm); objvalue=calobjvalue(newpop,i); %变异
for j=1:N %译码
temp(:,j)=decodechrom(newpop,1+(j-1)*length,length); %将newpop每行(个体)每列(每段基因)转化成十进制数
x(:,j)=temp(:,j)/(2^length-1)*(max(j)-min(j))+min(j); % popsize×N 将二值域中的数转化为变量域的数 
end
[bestindividual,bestfit]=best(newpop,fitvalue);%求出群体中亲和力强度最大的个体及其亲和力强度
if bestfit<ymax
ymax=bestfit;K=k;
end
% y(k)=bestfit;
if ymax<10 % 如果最大值小于设定阀值,停止进化
X{i}=x;
break
end
if k==1
fitvalue_for=fitvalue;x_for=x;
end
result=resultselect(fitvalue_for,fitvalue,x_for,x);
fitvalue_for=fitvalue;
x_for=x;
pop=newpop;
end
X{i}=result; % 第i类故障的popsize个监测器
distance=0; % 下面开始计算 Unnoralcode 属于每一类故障的概率:免疫应答!
for j=1:N
distance=distance+(result(:,j)-Unnoralcode(j)).^2; % 将得popsize个不同的距离
end
distance=sqrt(distance);D=0;
for p=1:popsize
if distance(p)<80 % 预设阀值
D=D+1;
end
end
P(i)=D/popsize; %Unnoralcode隶属每种故障类型的概率!(最终检测结果)-->P! 
end
X; % 结果为(i*popsie)个监测器(抗体)
%plot(1:M,favg) 

⌨️ 快捷键说明

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