📄 ga_new.m
字号:
function [a,b,d]=GA_new(x,D,Wnum,NIND,chrom,WmaX,a,b,d,ec2)
% x D:神经网络训练信号 Wnum:权值总数(含阀值) NIND:个体数目
% chrom: 个体集合
% a=zeros(2,6); %隶属函数中心值和宽度
% b=zeros(2,6);
% d=zeros(6,6); %输出层权值
% ec2:遗传算法修正权值的误差限(目标), 达到则退出遗传算法 net1:返回的网络
% maxI:最差个体编号 %%权值最大范围[-WmaX WmaX]
%%%%%%%%遗传算法代码%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
G=20000;
for g=1:G %%设置遗传10000代
%%%%%%%%%%%%%%%%%遗传算法第一步(选择算法应用轮盘选择算子)
%W=zeros(NIND,Wnum); %%权值矩阵
f=zeros(NIND,1); %%适应函数
e=zeros(NIND,1); %%网络误差函数
Onorm2=0; %%目标值二范数误差
F=0;%%适应度总和
%%%%% 计算这一代种群的适应度
for i=1:NIND
a(1,1:6)=chrom(i,1:6); %%遗传算法为神经网络赋值
a(2,1:6)=chrom(i,7:12);
b(1,1:6)=chrom(i,13:18); %%遗传算法为神经网络赋值
b(2,1:6)=chrom(i,19:24);
for ii=1:6
for jj=1:6
d(ii,jj)=chrom(i,24+(ii-1)*6+jj);
end
end
y=net_new(x,a,b,d); %%神经网络计算出结果
ee=D-y;
Onorm2=0.0;
for j=1:20
f(i,1)=f(i,1)+ee(j,1)*ee(j,1);
Onorm2=Onorm2+D(j,1)*D(j,1);
end
f(i,1)=f(i,1)/Onorm2;
e(i,1)=f(i,1);
f(i,1)=1/(f(i,1)+0.01);
F=F+ f(i,1);
end
maxI=1; %%得到误差最大的个体,即适应度最差的个体
Wmax=e(1,1);
for i=1:NIND
if e(i,1)>Wmax
Wmax=e(i,1);
maxI=i;
else
end
end
k=1; %%得到误差最小的个体,即适应度最好的个体
Wmin=e(1,1);
for i=1:NIND
if e(i,1)<Wmin
Wmin=e(i,1);
k=i;
else
end
end
%%用适应度最好的个体为神经网络赋值
a(1,1:6)=chrom(k,1:6); %%遗传算法为神经网络赋值
a(2,1:6)=chrom(k,7:12);
b(1,1:6)=chrom(k,13:18); %%遗传算法为神经网络赋值
b(2,1:6)=chrom(k,19:24);
for ii=1:6
for jj=1:6
d(ii,jj)=chrom(k,24+(ii-1)*6+jj);
end
end
%%计算神经网络的误差,若满足<=ec2则退出遗传算法
y=net_new(x,a,b,d); %%神经网络计算出结果
ee=D-y;
etemp=0.0;
Onorm2=0.0;
for j=1:20
etemp=etemp+ee(j,1)*ee(j,1);
Onorm2=Onorm2+D(j,1)*D(j,1);
end
etemp=etemp/Onorm2;
if etemp<=ec2
disp('etemp<=ec2,退出');
return;
else
end
disp('误差');
etemp
%%用于计算个体的交叉概率Pc和变异概率Pm
f_max=max(f);
f_min=min(f);
f_ave=F/NIND;
k1=0.9;
k2=0.9;
k3=0.1;
k4=0.1;
%%%%%计算每个染色体被选择的概率%%%%%%%%%%%%%%%%%
Pp=zeros(NIND,1);
Pp=f/F;
%%%%%%计算每个染色体的累计概率
Q=zeros(NIND,1);
for i=1:NIND
for j=i:NIND
Q(j)=Q(j)+Pp(i,1);
end
end
%%%%转动轮盘NIND次,产生NIND个[0 1]之间的随机数**********************
R=rand(NIND,1);
%%%%%%%%%%%%%应用轮盘算子选择新一代个体%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
chrom_temp=zeros(NIND,Wnum);
for m=1:NIND-1
for n=1:NIND
if R(m)<=Q(n)
chrom_temp(m,1:Wnum)=chrom(n,1:Wnum);
break;
else
end
end
end
chrom_temp(NIND,1:Wnum)=chrom(k,1:Wnum);
chrom=chrom_temp;
%%%%%%%%%%%%%%%%%遗传算法第二步,单点交叉%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
R=rand(NIND,1);
kc=0;%%要交叉的个体的数目
km=zeros(NIND,1);%%记录下需要交叉的个体编号
for t=1:NIND
%%计算Pc
if f(t,1)>=f_ave
Pc=k1*(f_max-f(t,1))/(f_max-f_ave)+0.05*k1;
else
Pc=k2;
end
if R(t)<=Pc
kc=kc+1;
km(kc,1)=t;
else
end
end
if (int8(kc/2)-kc/2)==0
for s=1:kc/2
kgene=int8((Wnum-1)*rand);%%交叉点的位置
kgene=kgene+1;
if kgene>Wnum
kgene=Wnum;
else
end
if km(kc/2+s,1)>NIND
km(kc/2+s,1)=NIND;
else
end
gene=chrom(km(s,1),int8(kgene):int8(Wnum)); %%
gene2=chrom(km(kc/2+s,1),int8(kgene):int8(Wnum));
randdd=rand;
chrom(km(s,1),int8(kgene):int8(Wnum))=randdd*gene+(1-randdd)*gene2;
chrom(km(kc/2+s,1),int8(kgene):int8(Wnum))=randdd*gene2+(1-randdd)*gene;
end
else if(int8(kc/2)-kc/2)~=0
for s=1:((kc-1)/2)
kgene=int8((Wnum-1)*rand);%%交叉点的位置
kgene=kgene+1;
if kgene>Wnum
kgene=Wnum;
else
end
if km((kc-1)/2+s,1)>NIND
km((kc-1)/2+s,1)=NIND;
else
end
gene=chrom(km(s,1),int8(kgene):int8(Wnum));
gene2=chrom(km((kc-1)/2+s,1),int8(kgene):int8(Wnum));
randdd=rand;
chrom(km(s,1),int8(kgene):int8(Wnum))=randdd*gene+(1-randdd)*gene2;
chrom(km((kc-1)/2+s,1),int8(kgene):int8(Wnum))=randdd*gene2+(1-randdd)*gene;
end
end
%%%%%%%%%%%%%%%%%%遗传算法第三步,变异运算%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
R=rand(NIND,1);
for t=1:NIND
%%计算Pm
if f(t,1)>=f_ave
Pm=k3*(f_max-f(t,1))/(f_max-f_ave)+0.05*k3;
else
Pm=k4;
end
if R(t)<=Pm
kmut=int8((NIND-1)*rand(1));%%产生要进行变异的个体编号
kmut=kmut+1;
if kmut>NIND
kmut=NIND;
else
end
kmutgene=int8((Wnum-1)*rand(1));%%产生要进行变异的基因的编号
kmutgene=kmutgene+1;
if kmutgene>Wnum
kmutgene=Wnum;
else
end
tempp=chrom(kmut,kmutgene);
if rand>0.5
tempss=rand;
%fff=1-tempss.^((1.0-g/G).^2.0);
chrom(kmut,kmutgene)=tempp+(max(chrom(kmut,1:Wnum))-tempp)*tempss;
else
tempss=rand;
%fff=1-tempss.^((1.0-g/G).^2.0);
chrom(kmut,kmutgene)=tempp+(min(chrom(kmut,1:Wnum))-tempp)*tempss;
end
end
end
disp('个体计算完成,g=');
g
end
if g==G
disp(['遗传算法达到次,未满足ec2误差限值']);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -