📄 haiyang.m
字号:
%清空内存
clear all;
%关闭警告消息
nntwarn off;
%个体数目
NIND=20;
%代沟
GGAP=0.7;
%免疫遗传最大进化代数
MAXGEN=500;
%变异率
MutOpt=[0.7 1.0];
%个体方差门限值
THRETHOLD=3.1;
%遗传算法性能跟踪
tracega=zeros(MAXGEN,2);
%各层神经元数目
I=6;J=9;K=1;
%需要调整的权值和阈值的总数(按照配置 6-9-1计算)
VARNUM=J*I+K*J+1*J+1*K;
%BP网络最大迭代次数
MAXEPOCH=20000;
epoch=1;
%BP网络允许误差范围
err_goal=0.01;
%学习速率
lr=0.04; %BP网络性能跟踪
tracebp=zeros(MAXEPOCH,2);
%训练数据集数目
TRAINNUM=20;
%设置一个标志位表示是否在当前的种群中
%找到了符合条件的 BP网络初始权值/阈值个体
Found=0;
%进化代数计数器
gen=0;
bestm_hold=zeros(NIND,VARNUM);
bestv_hold=zeros(NIND,1);
bestm=zeros(NIND,VARNUM);
bestv=zeros(NIND,1);
a=0.7;%亲和度系数
%输入训练数据和理想训练输出数据
X=[0.3333333 0.4266667 0.6500000 0.1080000 0.4300000 0.5880000;
0.4333333 0.4800000 0.0700000 0.2880000 0.1000000 0.2860000;
0.5666667 0.5733333 0.7500000 0.8200000 0.3600000 0.5000000;
0.3333333 0.3733333 0.6500000 0.1600000 0.5400000 0.4360000;
0.5000000 0.5866667 0.6500000 0.1240000 0.4700000 0.8200000;
0.3666667 0.4133333 0.6000000 0.0680000 0.4000000 0.2980000;
0.4000000 0.5400000 0.7000000 0.2920000 0.2600000 0.6400000;
0.9000000 0.7066667 0.6000000 0.1280000 0.3200000 0.0420000;
0.1666667 0.3133333 0.7000000 0.2080000 0.5600000 0.7480000 ;
0.4000000 0.6933333 0.7500000 0.2080000 0.0700000 0.1280000;
0.3333333 0.6266667 0.8000000 0.3240000 0.1800000 0.1244000;
0.3666667 0.6666667 0.7000000 0.2240000 0.3900000 0.5840000;
0.3000000 0.3733333 0.6500000 0.1600000 0.5400000 0.5920000;
0.5166667 0.7066667 0.6700000 0.3360000 0.0800000 0.1020800;
0.2900000 0.4133333 0.6300000 0.1400000 0.4700000 0.4209200;
0.7533333 0.8800000 0.7550000 0.0680000 0.4100000 0.4974800;
0.3766667 0.6000000 0.8050000 0.3120000 0.1900000 0.1231200;
0.5200000 0.5866667 0.6550000 0.1160000 0.5400000 0.6800800;
0.2500000 0.7400000 0.8650000 0.3240000 0.2400000 0.0419600;
0.3266667 0.4600000 0.6250000 0.1000000 0.3700000 0.5262800;
0.3433333 0.4133333 0.6800000 0.1240000 0.4100000 0.5528800;
%0.3300000 0.6266667 0.7000000 0.2400000 0.3400000 0.4741600;
0.3133333 0.4466667 0.5850000 0.0680000 0.4100000 0.2688400;
0.4266667 0.7133333 0.2800000 0.0960000 0.4800000 0.7786800;
0.7333333 0.8866667 0.7500000 0.0560000 0.4000000 0.3592000;
0.3000000 0.7066667 0.9000000 0.3320000 0.2100000 0.0388800;
0.4666667 0.6933333 0.2500000 0.0920000 0.4300000 0.9040000;
0.4666667 0.7466667 0.7000000 0.3520000 0.0700000 0.1272000;];
%输出数据集
%T=[0.0137455;0.9636364;0.4727273;0.0050909;0.0073455;0.0108909;0.8490545;0.1663273;
%0.0138182;0.3272727;0.8001818;0.8538545;0.0032182;0.3075455;0.0057455;0.0131636;
%0.7545273;0.0055455;0.0448364;0.0132909;0.0135636;0.5631818;0.0164182;0.1688182;
%0.0150545;0.0430909;0.1098182;0.2908364;];
T=[0.0126000;0.8833333;0.4333333;0.0046667;0.0067333;0.0099833;0.7783000;0.1524667;
0.0126667;0.3000000;0.7335000;0.7827000;0.0029500;0.2819167;0.0052667;0.0120667;
0.6916500;0.0050833;0.0411000;0.0121833;0.0124833;0.0150500;0.1547500;
0.0136000;0.0395000;0.1006667;0.2666000;];
%0.5162500;
%T=[0.0075600;0.5300000;0.2600000;0.0028000;0.0040400;0.0059900;0.4669800;0.0914800;
%0.0076000;0.1800000;0.4401000;0.4696200;0.0017700;0.1691500;0.0031600;0.0072400;
%0.4149900;0.0030500;0.0246600;0.0073100;0.0074900;0.3097500;0.0090300;0.0928600;
%0.0082800;0.0237000;0.0604000;0.1599600;];
%输入和输出数据集转置
X=X';T=T';
%选择训练数据集
X_train=[X(:,linspace(1,TRAINNUM,TRAINNUM))];
T_train=[T(:,linspace(1,TRAINNUM,TRAINNUM))];
[R,S]=size(T_train);
%生成描述矩阵
FieldD=[rep([-2;2],[1,VARNUM])];
%创建一个含有 NIND个个体,每个个体有 VARNUM个实值变量的初始种群
Chrom=crtrp(NIND,FieldD);
%初始化网络计算结果矩阵、误差矩阵和方差矩阵(实际是两个列向量)
Grass=zeros(NIND,S);
E=zeros(NIND,S);
SSE=zeros(NIND,1);
%分别对每一组输入的训练数据进行网络计算并得出结果和方差
for i=1:NIND
%对每个个体进行变量解析得到该个体代表的网络权值及阈值矩阵
[Wij,bj,Wjk,bk]=ParamsParse1(Chrom(i,:),I,J,K);
%使用上面解析出的网络参数对训练数据进行计算
[tmp1 Grass(i,:) E(i,:) SSE(i,1)]= PredictNet21(Wij,bj,Wjk,bk,X_train,T_train);
end
%计时开始
tic
%开始循环
while((Found==0) && (gen<MAXGEN))
%定义最佳值所在的行和列
BestRow=0;BestCol=0;
%在当前种群中查找是否有个体满足 SSE小于给定值
[BestRow,BestCol]=find(SSE<THRETHOLD,1,'first');
%如果找到,Found标志位置 1,转入 BP网络参数调整
if(BestRow) Found=1;
%找到的合适个体作为 BP网络的初始参数集
InitSet=Chrom(BestRow,:);
%对这个个体进行参数解析
[Wij,bj,Wjk,bk]=ParamsParse1(InitSet,I,J,K);
for epoch=1:MAXEPOCH
%使用梯度下降法调整 BP网络
[Oj Ok E SSE]= PredictNet21(Wij,bj,Wjk,bk,X_train,T_train);
%性能跟踪
tracebp(epoch,1)=sum(E)/length(E);
tracebp(epoch,2)=sum(SSE)/length(SSE);
%判断误差是否达到要求
if(SSE<err_goal)
break;
end
%计算输出层的 delta
deltak=deltalin(Ok,E);
%计算隐含层 的 delta
deltaj=deltatan(Oj,deltak,Wjk);
%调整输出层加权系数
[dWjk,dbk]=learnbp(Oj,deltak,lr);
Wjk=Wjk+dWjk;bk=bk+dbk;
%调整隐含层加权系数
[dWij,dbj]=learnbp(X_train,deltaj,lr);
Wij=Wij+dWij;
bj=bj+dbj;
end
else %如果当前种群中没有找到合适个体,就开始用免疫遗传算法调整种群
%计算适应度值(目标函数值取刚才算出的方差,
%方差越小适应值越大)
FitnV=ranking(SSE);
%FitnV
for i=1:NIND
for j=i+1:NIND %抗体群排序
if FitnV(j,1)>FitnV(i,1)
t=FitnV(i,1);
FitnV(i,1)=FitnV(j,1);
FitnV(j,1)=t;
tt=Chrom(i,:);
Chrom(i,:)=Chrom(j,:);
Chrom(j,:)=tt;
end
end
end
%FitnV
for i=1:1 %免疫记忆细胞
bestm(i,:)=Chrom(i,:);
bestv(i,1)=FitnV(i,1);
%bestv(i,1)
end
if gen==1
bestm_hold=bestm;
bestv_hold=bestv;
end
for i=1:1
if bestv_hold(i,1)>bestv(i,1)
Chrom(i,:)=bestm_hold(i,:);
FitnV(i,1)=bestv_hold(i,1);
else
bestm_hold(i,:)=bestm(i,:);
bestv_hold(i,1)=bestv(i,1);
end
end
for i=1:NIND %浓度计算
for j=1:NIND
vector1(j)=abs(FitnV(i,1)-FitnV(j,1));
end
vector(i)=sum(vector1);
end
for i=1:NIND
p1(i,1)=vector(i)/sum(vector);
end
for i=1:NIND
FitnV(i,1)=a.*FitnV(i,1)+(1-a).*p1(i,1);
end
%选择操作(有代沟,选择出的个体数目小于父种群)
SelCh=select('sus',Chrom,FitnV,GGAP); %交叉(重组)操作
SelCh=recombin('xovmp',SelCh,0.2); %变异操作
SelCh=mutbga(SelCh,FieldD,MutOpt);
%获得 SelCh的尺寸
[M,N]=size(SelCh);
%初始化 SelCh对应的结果矩阵和方差矩阵
GrassSel=zeros(M,S);
SSESel=zeros(M,1);
for j=1:M
%计算 SelCh中每个个体所代表的权值和阈值矩阵
%在网络中参与运算的结果
[Wijs,bjs,Wjks,bks]=ParamsParse1(SelCh,I,J,K);
[tmp1 GrassSel(j,:),ESel,SSESel(j,1)]= PredictNet21(Wijs,bjs,Wjks,bks,X_train,T_train);
end
%插入操作
[Chrom SSE]=reins(Chrom,SelCh,1,1,SSE,SSESel);
%进化计数器加一
gen=gen+1;
%遗传算法性能记录
tracega(gen,1)=min(SSE);
tracega(gen,2)=sum(SSE)/length(SSE);
end
end
%计时结束
toc
%绘制 BP网络的性能跟踪图形
%figure(3);
%plot(tracebp(:,1));
%hold on;
%plot(tracebp(:,2),'r-.');
%grid on;
%legend('误差变化趋势','方差变化趋势');
%绘制遗传算法的性能跟踪图形
%figure(4);
%plot(tracega(:,1));
%hold on;
%plot(tracega(:,2),'r-.');
%grid on;
%legend('解的变化','种群均值的变化');
%输出遗传算法的进化代数
gen %输出 BP网络的迭代次数
epoch
%使用若干组数据作测试
%X_test=[X(:,linspace(TRAINNUM+1,36,36-TRAINNUM))];
%T_test=[T(:,linspace(TRAINNUM+1,36,36-TRAINNUM))];
X_test=X;
T_test=T;
[tmp1,Out_test,Out_E,Out_SSE]=PredictNet21(Wij,bj,Wjk,bk,X_test,T_test);
%输出误差
figure(1);
%plot(linspace(0,36-TRAINNUM-1,36-TRAINNUM),Out_E,'bo-');
%hold on;
%plot(linspace(0,36-TRAINNUM-1,36-TRAINNUM),Out_SSE,'rv--');
%grid on;
plot(Out_E.^2,'bo-');
xlabel('组别');
ylabel('误差的平方');
axis([0 30 0 0.14]);
grid on;
%T
%Out_test
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -