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

📄 haiyang.m

📁 基于海洋综合观测平台的海洋信息处理技术是海洋预警系统开发的技术支撑,建立基于海洋综合观测平台的海洋信息处理及预警系统
💻 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 + -