%定义用5x3布尔量网络表示的16个十六进制数0,1,2,……9,A,……,F
X0=[1 1 1;1 0 1;1 0 1;1 0 1;1 1 1];X1=[0 1 0;0 1 0;0 1 0;0 1 0;0 1 0];
X2=[1 1 1;0 0 1;0 1 0;1 0 0;1 1 1];X3=[1 1 1;0 0 1;0 1 0;0 0 1;1 1 1];
X4=[1 0 1;1 0 1;1 1 1;0 0 1;0 0 1];X5=[1 1 1;1 0 0;1 1 1;0 0 1;1 1 1];
X6=[1 1 1;1 0 0;1 1 1;1 0 1;1 1 1];X7=[1 1 1;0 0 1;0 0 1;0 0 1;0 0 1];
X8=[1 1 1;1 0 1;1 1 1;1 0 1;1 1 1];X9=[1 1 1;1 0 1;1 1 1;0 0 1;1 1 1];
XA=[0 1 0;1 0 1;1 0 1;1 1 1;1 0 1];XB=[1 1 1;1 0 1;1 1 0;1 0 1;1 1 1];
XC=[1 1 1;1 0 0;1 0 0;1 0 0;1 1 1];XD=[1 1 1;1 0 1;1 0 1;1 0 1;1 1 1];
XE=[1 1 1;1 0 0;1 1 0;1 0 0;1 1 1];XF=[1 1 1;1 0 0;1 1 0;1 0 0;1 0 0];
%将每个用5x3布尔量网络表示的数按列表示,生成输入矩阵X
X=[X0(:) X1(:) X2(:) X3(:) X4(:) X5(:) X6(:) X7(:) X8(:)...
X9(:) XA(:) XB(:) XC(:) XD(:) XE(:) XF(:)];
%定义每个十六进制数对应的目标向量,生成目标矩阵T
T0=[0;0;0;0];T1=[0;0;0;1];T2=[0;0;1;0];T3=[0;0;1;1];
T4=[0;1;0;0];T5=[0;1;0;1];T6=[0;1;1;0];T7=[0;1;1;1];
T8=[1;0;0;0];T9=[1;0;0;1];TA=[1;0;1;0];TB=[1;0;1;1];
TC=[1;1;0;0];TD=[1;1;0;1];TE=[1;1;1;0];TF=[1;1;1;1];
T=[T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 TA TB TC TD TE TF];
%建立网络
for hidden_num=4:15
perf_matrix=[];
net=newff(minmax(X),[hidden_num,4],{'tansig','purelin'},'traingdm');
%利用不含噪声的理想数据训练网络
net.trainParam.show=2000;
net.trainParam.epochs=4000;
net.trainParam.goal=0.01;
net.trainParam.lr=0.1;
net.trainParam.mc=0.95;
net.trainParam.min_grad=1e-15;
net=train(net,X,T);
A=sim(net,X);
err=T-A;
perf=mse(err);
perf_matrix=[perf_matrix perf];
clear net
end
%选择训练误差最小时所对应的隐层神经元数
best_hidden_num=3+find(perf_matrix==min(perf_matrix));
net=newff(minmax(X),[best_hidden_num,4],{'tansig','purelin'},'traingdm');
net.trainParam.show=1000;
net.trainParam.epochs=8000;
net.trainParam.goal=0.01;
net.trainParam.lr=0.1;
net.trainParam.mc=0.95;
net.trainParam.min_grad=1e-15;
net.trainParam.minstep=1e-10;
net=train(net,X,T);
%定义网络的输入为十六进制数1,3,5,7,9,B,D,F
X2=X(:,2:2:16);
t=T(:,2:2:16);
y=sim(net,X2)