% gap.xls中存储训练样本的原始输入数据 37组
% gat.xls中存储训练样本的原始输出数据 37组
% p_test.xls中存储测试样本的原始输入数据 12组
% t_test.xls中存储测试样本的原始输出数据 12组
% 其中gabpEval.m适应度值计算函数,gadecod.m解码函数
%--------------------------------------------------------------------------
nntwarn off;% nntwarn函数可以临时关闭神经网络工具箱的警告功能,当代码使用到神经
% 网络工具箱的函数时会产生大量的警告 而这个函数可以跳过这些警告 但
% 是,为了保证代码可以在新版本的工具箱下运行,我们不鼓励这么做
pc=xlsread('gap.xls');
tc=xlsread('gat.xls');
p_test=xlsread('p_test.xls');
t_test=xlsread('t_test.xls');
p=pc';
t=tc';
p_test=p_test';
t_test=t_test';
% 归一化处理
for i=1:2
P(i,:)=(p(i,:)-min(p(i,:)))/(max(p(i,:))-min(p(i,:)));
end
for i=1:4
T(i,:)=(t(i,:)-min(t(i,:)))/(max(t(i,:))-min(t(i,:)));
end
for i=1:2
P_test(i,:)=(p_test(i,:)-min(p_test(i,:)))/(max(p_test(i,:))-min(p_test(i,:)));
end
%--------------------------------------------------------------------------
% 创建BP神经网络,隐含层节点数为12
net=newff(minmax(P),[12,4],{'tansig','purelin'},'trainlm');
%--------------------------------------------------------------------------
% 下面使用遗传算法对网络进行优化
R=size(P,1);% BP神经网络输入层节点数
S2=size(T,1);% BP神经网络输出层节点数
S1=12;% 隐含层节点数
S=R*S1+S1*S2+S1+S2;% 遗传算法编码长度
aa=ones(S,1)*[-1,1];
popu=100;% 种群规模
initPop=initializega(popu,aa,'gabpEval');% 初始化种群
gen=500;% 遗传代数
% 下面调用gaot工具箱,其中目标函数定义为gabpEval
[x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPop,[1e-6 1 1],'maxGenTerm',...
gen,'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);
%--------------------------------------------------------------------------
% 绘收敛曲线图
figure;
plot(trace(:,1),1./trace(:,3),'r-');
hold on;
plot(trace(:,1),1./trace(:,2),'b-');
xlabel('遗传代数');
ylabel('平方和误差');
figure;
plot(trace(:,1),trace(:,3),'r-');
hold on;
plot(trace(:,1),trace(:,2),'b-');
xlabel('遗传代数');
ylabel('适应度');legend('平均适应度值','最优适应度值');
%--------------------------------------------------------------------------
% 下面将初步得到的权值矩阵赋给尚未开始训练的BP网络
[W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x);
net.IW{1,1}=W1;
net.LW{2,1}=W2;
net.b{1}=B1;
net.b{2}=B2;
% 设置训练参数
net.trainParam.epochs=3000;
net.trainParam.goal=1e-6;
% 训练网络
net=train(net,P,T);
w1=net.IW{1,1};
w2=net.LW{2,1};
b1=net.b{1};
b2=net.b{2};
% 测试网络性能
temp=sim(net,P_test);
yuce1=[temp(1,:);temp(2,:),;temp(3,:);temp(4,:)];
for i=1:4
yuce(i,:)=yuce1(i,:)*(max(t_test(i,:))-min(t_test(i,:)))+min(t_test(i,:));
end
%--------------------------------------------------------------------------
% 测试输出结果之一
figure;
plot(1:12,yuce(1,:),'bo-');
ylabel('切口外径 mm');
hold on;
plot(1:12,t_test(1,:),'r*-');
legend('测试结果','测试样本');
figure;
plot(1:12,yuce(1,:)-t_test(1,:),'b-');
ylabel('误差 mm');
title('测试结果与测试样本误差');
figure;
plot(1:12,((yuce(1,:)-t_test(1,:))/t_test(1,:))*100,'b*');
ylabel('百分比');
title('测试结果与测试样本误差');
% 测试输出结果之二
figure;
plot(1:12,yuce(2,:),'bo-');
ylabel('切口内径 mm');
hold on;
plot(1:12,t_test(2,:),'r*-');
legend('测试结果','测试样本');
figure;
plot(1:12,yuce(2,:)-t_test(2,:),'b-');
ylabel('误差 mm');
title('测试结果与测试样本误差');
figure;
plot(1:12,((yuce(2,:)-t_test(2,:))/t_test(2,:))*100,'b*');
ylabel('百分比');
title('测试结果与测试样本误差');
% 测试输出结果之三
figure;
plot(1:12,yuce(3,:),'bo-');
ylabel('最大滚切力 N');
hold on;
plot(1:12,t_test(3,:),'r*-');
legend('测试结果','测试样本');
figure;
plot(1:12,yuce(3,:)-t_test(3,:),'b-');
ylabel('误差 N');
title('测试结果与测试样本误差');
figure;
plot(1:12,((yuce(3,:)-t_test(3,:))/t_test(3,:))*100,'b*');
ylabel('百分比');
title('测试结果与测试样本误差');
% 测试输出结果之四
figure;
plot(1:12,yuce(4,:),'bo-');
ylabel('切断时间 s');
hold on;
plot(1:12,t_test(4,:),'r*-');
legend('测试结果','测试样本');
figure;
plot(1:12,yuce(4,:)-t_test(4,:),'b-');
ylabel('误差 s');
title('测试结果与测试样本误差');
figure;
plot(1:12,((yuce(4,:)-t_test(4,:))/t_test(4,:))*100,'b*');
ylabel('百分比');
title('测试结果与测试样本误差');
%--------------------------------------------------------------------------