?? 用bp網絡解決異或問題(c++語言).txt
字號:
#include<iostream.h>
#include<time.h>
#include<stdlib.h>
#include<math.h>
void main()
{
time_t t;
srand((unsigned) time(&t));
double w11,w12,w21,w22,v1,v2,q1,q2,r;
//輸入層至中間層連接權,中間層至輸出層連接權,中間層各單元輸出閥值,輸出層單元輸出閥值
w11=(rand()/32767.0)*2-1; //(-1,1)之間的隨機數,初始化權值及閥值
w12=(rand()/32767.0)*2-1;
w21=(rand()/32767.0)*2-1;
w22=(rand()/32767.0)*2-1;
v1=(rand()/32767.0)*2-1;
v2=(rand()/32767.0)*2-1;
q1=(rand()/32767.0)*2-1;
q2=(rand()/32767.0)*2-1;
r=(rand()/32767.0)*2-1;
double x[3][1],y[3];
int k,n=0;
double s1,s2,b1,b2,L,C,d,e1,e2;
//輸入模式向量,希望輸出向量,中間層單元輸入向量、輸出向量,輸出層單元輸入向量、輸出向量
// 輸出層的各單元的誤差,中間層各單元的誤差
double a=0.6,b=0.6; //網絡學習率
double E=0,h=0.0011; //全局誤差函數
//----------------------------------------------
k=rand()%4;
x[k][0]=(rand()/32767.0)*2-1; //取隨機訓練模式對
x[k][1]=(rand()/32767.0)*2-1;
if(x[k][0]<0.5)
x[k][0]=0.0;
else
x[k][0]=1.0;
if(x[k][1]<0.5)
x[k][1]=0.0;
else
x[k][1]=1.0;
if(x[k][0]==0.0 && x[k][1]==0.0 || x[k][0]==1.0 && x[k][1]==1.0)
y[k]=0.0;
else
y[k]=1.0;
cout<<"輸入模式對:"<<endl;
cout<<"x["<<k<<"][0]="<<x[k][0]<<endl;
cout<<"x["<<k<<"][1]="<<x[k][1]<<endl;
cout<<"理想輸出:y["<<k<<"]="<<y[k]<<endl;
//----------------------------------------------
//訓練
E=h+1;
while (E>h)
{
E=0;
n++;
s1=w11*x[k][0]+w21*x[k][1]-q1; //中間層單元各輸入
b1=1/(1+exp(s1)); //中間層單元各輸出
s2=w12*x[k][0]+w22*x[k][1]-q2;
b2=1/(1+exp(s2));
//----------------------------------------
L=v1*b1+v2*b2-r; //輸出層單元輸入
C=1/(1+exp(L)); //輸出層單元輸出
//----------------------------------------
d=(y[k]-C)*C*(1-C); //輸出層的各單元的誤差
//----------------------------------------
e1=d*v1*b1*(1-b1); //中間層各單元的誤差
e2=d*v2*b2*(1-b2);
//-------------------------------------------
v1=v1+a*d*b1; //修正中間層至輸出層連接權
v2=v2+a*d*b2;
r=r+a*d; //修正輸出層單元輸出閥值
//-------------------------------------------
w11=w11+b*e1*x[k][0]; //修正輸入層至中間層連接權
w12=w12+b*e2*x[k][0];
w21=w21+b*e1*x[k][1];
w22=w22+b*e2*x[k][1];
q1=q1+b*e1; //修正中間層各單元輸出閥值
q2=q2+b*e2;
//-------------------------------------------
E=(y[k]-C)*(y[k]-C)/2;
if(n>10000) //自適應調整
b*=1.05;
}
if(C<0.5)
C=0.0;
else
C=1.0;
cout<<"E="<<E<<endl;
cout<<"訓練次數:n="<<n<<endl;
cout<<"實際輸出:C="<<C<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -