C++ Neural Networks and Fuzzy Logic
by Valluru B. Rao M&T Books, IDG Books Worldwide, Inc. ISBN: 1558515526 Pub Date: 06/01/95 |
Previous | Table of Contents | Next |
Listing 8.2 bamntwrk.cpp
//bamntwrk.cpp V. Rao, H. Rao //Source file for BAM network program #include bamntwrk.h void bmneuron::getnrn(int m1,int m2,int m3,char *y) { int i; name = y; nnbr = m1; outn = m2; inn = m3; for(i=0;i<outn;++i){ outwt[i] = 0 ; } output = 0; activation = 0; } void exemplar::getexmplr(int k,int l,int *b1,int *b2) { int i2; xdim = k; ydim = l; for(i2=0;i2<xdim;++i2){ v1[i2] = b1[i2]; } for(i2=0;i2<ydim;++i2){ v2[i2] = b2[i2]; } } void exemplar::prexmplr() { int i; cout<<\nX vector you gave is:\n; for(i=0;i<xdim;++i){ cout<<v1[i]<< ;} cout<<\nY vector you gave is:\n; for(i=0;i<ydim;++i){ cout<<v2[i]<< ;} cout<<\n; } void exemplar::trnsfrm() { int i; for(i=0;i<xdim;++i){ u1[i] = 2*v1[i] -1;} for(i=0;i<ydim;++i){ u2[i] = 2*v2[i] - 1;} } void exemplar::prtrnsfrm() { int i; cout<<\nbipolar version of X vector you gave is:\n; for(i=0;i<xdim;++i){ cout<<u1[i]<< ;} cout<<\nbipolar version of Y vector you gave is:\n; for(i=0;i<ydim;++i){ cout<<u2[i]<< ;} cout<<\n; } void asscpair::getasscpair(int i,int j,int k) { idn = i; xdim = j; ydim = k; } void asscpair::prasscpair() { int i; cout<<\nX vector in the associated pair no. <<idn<< is:\n; for(i=0;i<xdim;++i){ cout<<v1[i]<< ;} cout<<\nY vector in the associated pair no. <<idn<< is:\n; for(i=0;i<ydim;++i){ cout<<v2[i]<< ;} cout<<\n; } void potlpair::getpotlpair(int k,int j) { xdim = k; ydim = j; } void potlpair::prpotlpair() { int i; cout<<\nX vector in possible associated pair is:\n; for(i=0;i<xdim;++i){ cout<<v1[i]<< ;} cout<<\nY vector in possible associated pair is:\n; for(i=0;i<ydim;++i){ cout<<v2[i]<< ;} cout<<\n; } void network::getnwk(int k,int l,int k1,int b1[][6],int b2[][5]) { anmbr = k; bnmbr = l; nexmplr = k1; nasspr = 0; ninpt = 0; int i,j,i2; flag =0; char *y1=ANEURON, *y2=BNEURON ; for(i=0;i<nexmplr;++i){ e[i].getexmplr(anmbr,bnmbr,b1[i],b2[i]); e[i].prexmplr(); e[i].trnsfrm(); e[i].prtrnsfrm(); } for(i=0;i<anmbr;++i){ anrn[i].bmneuron::getnrn(i,bnmbr,0,y1);} for(i=0;i<bnmbr;++i){ bnrn[i].bmneuron::getnrn(i,0,anmbr,y2);} for(i=0;i<anmbr;++i){ for(j=0;j<bnmbr;++j){ mtrx1[i][j] = 0; for(i2=0;i2<nexmplr;++i2){ mtrx1[i][j] += e[i2].u1[i]*e[i2].u2[j];} mtrx2[j][i] = mtrx1[i][j]; anrn[i].outwt[j] = mtrx1[i][j]; bnrn[j].outwt[i] = mtrx2[j][i]; } } prwts(); cout<<\n; } void network::asgninpt(int *b) { int i; cout<<\n; for(i=0;i<anmbr;++i){ anrn[i].output = b[i]; outs1[i] = b[i]; } } void network::compr1(int j,int k) { int i; for(i=0;i<anmbr;++i){ if(pp[j].v1[i] != pp[k].v1[i]) flag = 1; break; } } void network::compr2(int j,int k) { int i; for(i=0;i<anmbr;++i){ if(pp[j].v2[i] != pp[k].v2[i]) flag = 1; break;} } void network::comput1() { int j; for(j=0;j<bnmbr;++j){ int ii1; int c1 =0,d1; cout<<\n; for(ii1=0;ii1<anmbr;++ii1){ d1 = outs1[ii1] * mtrx1[ii1][j]; c1 += d1; } bnrn[j].activation = c1; cout<<\n output layer neuron <<j<< activation is <<c1<<\n; if(bnrn[j].activation <0) { bnrn[j].output = 0; outs2[j] = 0;} else if(bnrn[j].activation>0) { bnrn[j].output = 1; outs2[j] = 1;} else {cout<<\n A 0 is obtained, use previous output value \n; if(ninpt<=nexmplr){ bnrn[j].output = e[ninpt-1].v2[j];} else { bnrn[j].output = pp[0].v2[j];} outs2[j] = bnrn[j].output; } cout<<\n output layer neuron <<j<< output is <<bnrn[j].output<<\n; } } void network::comput2() { int i; for(i=0;i<anmbr;++i){ int ii1; int c1=0; for(ii1=0;ii1<bnmbr;++ii1){ c1 += outs2[ii1] * mtrx2[ii1][i]; } anrn[i].activation = c1; cout<<\ninput layer neuron <<i<<activation is <<c1<<\n; if(anrn[i].activation <0 ){ anrn[i].output = 0; outs1[i] = 0;} else if(anrn[i].activation >0 ) { anrn[i].output = 1; outs1[i] = 1; } else { cout<<\n A 0 is obtained, use previous value if available\n; if(ninpt<=nexmplr){ anrn[i].output = e[ninpt-1].v1[i];} else {anrn[i].output = pp[0].v1[i];} outs1[i] = anrn[i].output;} cout<<\n input layer neuron <<i<< output is <<anrn[i].output<<\n; } } void network::asgnvect(int j1,int *b1,int *b2) { int j2; for(j2=0;j2<j1;++j2){ b2[j2] = b1[j2];} } void network::prwts() { int i3,i4; cout<<\n weights input layer to output layer: \n\n; for(i3=0;i3<anmbr;++i3){ for(i4=0;i4<bnmbr;++i4){ cout<<anrn[i3].outwt[i4]<< ;} cout<<\n; } cout<<\n; cout<<\nweights output layer to input layer: \n\n; for(i3=0;i3<bnmbr;++i3){ for(i4=0;i4<anmbr;++i4){ cout<<bnrn[i3].outwt[i4]<< ;} cout<<\n; } cout<<\n; } void network::iterate() { int i1; for(i1=0;i1<nexmplr;++i1){ findassc(e[i1].v1); } } void network::findassc(int *b) { int j; flag = 0; asgninpt(b); ninpt ++; cout<<\nInput vector is:\n ; for(j=0;j<6;++j){ cout<<b[j]<< ;} cout<<\n; pp[0].getpotlpair(anmbr,bnmbr); asgnvect(anmbr,outs1,pp[0].v1); comput1(); if(flag>=0){ asgnvect(bnmbr,outs2,pp[0].v2); cout<<\n; pp[0].prpotlpair(); cout<<\n; comput2(); } for(j=1;j<MXSIZ;++j){ pp[j].getpotlpair(anmbr,bnmbr); asgnvect(anmbr,outs1,pp[j].v1); comput1(); asgnvect(bnmbr,outs2,pp[j].v2); pp[j].prpotlpair(); cout<<\n; compr1(j,j-1); compr2(j,j-1); if(flag == 0) { int j2; nasspr += 1; j2 = nasspr; as[j2].getasscpair(j2,anmbr,bnmbr); asgnvect(anmbr,pp[j].v1,as[j2].v1); asgnvect(bnmbr,pp[j].v2,as[j2].v2); cout<<\nPATTERNS ASSOCIATED:\n; as[j2].prasscpair(); j = MXSIZ ; } else if(flag == 1) { flag = 0; comput1(); } } } void network::prstatus() { int j; cout<<\nTHE FOLLOWING ASSOCIATED PAIRS WERE FOUND BY BAM\n\n; for(j=1;j<=nasspr;++j){ as[j].prasscpair(); cout<<\n;} } void main() { int ar = 6, br = 5, nex = 3; int inptv[][6]={1,0,1,0,1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,1,0,1,0,1, 1,1,1,1,1,1}; int outv[][5]={1,1,0,0,1,0,1,0,1,1,1,0,0,1,0}; cout<<\n\nTHIS PROGRAM IS FOR A BIDIRECTIONAL ASSOCIATIVE MEMORY NETWORK.\n; cout<< THE NETWORK ISSET UP FOR ILLUSTRATION WITH <<ar<< INPUT NEURONS, AND <<br; cout<< OUTPUT NEURONS.\n<<nex << exemplars are used to encode \n; static network bamn; bamn.getnwk(ar,br,nex,inptv,outv) ; bamn.iterate(); bamn.findassc(inptv[3]); bamn.findassc(inptv[4]); bamn.prstatus(); }
Previous | Table of Contents | Next |