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 9.1 fuzzyam.h
//fuzzyam.h V. Rao, H. Rao #include <iostream.h> #define MXSIZ 10 class fzneuron { protected: int nnbr; int inn,outn; float output; float activation; float outwt[MXSIZ]; char *name; friend class network; public: fzneuron() { }; void getnrn(int,int,int,char *); }; class exemplar { protected: int xdim,ydim; float v1[MXSIZ],v2[MXSIZ]; // this is different from BAM friend class network; public: exemplar() { }; void getexmplr(int,int,float *,float *); void prexmplr(); }; class asscpair { protected: int xdim,ydim,idn; float v1[MXSIZ],v2[MXSIZ]; friend class network; public: asscpair() { }; void getasscpair(int,int,int); void prasscpair(); }; class potlpair { protected: int xdim,ydim; float v1[MXSIZ],v2[MXSIZ]; friend class network; public: potlpair() { }; void getpotlpair(int,int); void prpotlpair(); }; class network { public: int anmbr,bnmbr,flag,nexmplr,nasspr,ninpt; fzneuron (anrn)[MXSIZ],(bnrn)[MXSIZ]; exemplar (e)[MXSIZ]; asscpair (as)[MXSIZ]; potlpair (pp)[MXSIZ]; float outs1[MXSIZ],outs2[MXSIZ]; // change from BAM to floats double mtrx1[MXSIZ][MXSIZ],mtrx2[MXSIZ][MXSIZ]; // change from BAM to doubles network() { }; void getnwk(int,int,int,float [][6],float [][4]); void compr1(int,int); void compr2(int,int); void prwts(); void iterate(); void findassc(float *); void asgninpt(float *); void asgnvect(int,float *,float *); void comput1(); void comput2(); void prstatus(); };
Listing 9.2 fuzzyam.cpp
//fuzzyam.cpp V. Rao, H. Rao #include "fuzzyam.h" float max(float x,float y) //new for FAM { float u; u = ((x>y) ? x : y ); return u; } float min(float x,float y) // new for FAM { float u; u =( (x>y) ? y : x) ; return u; } void fzneuron::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,float *b1,float *b2) // changed from BAM { 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 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,float b1[][6],float b2[][4]) { anmbr = k; bnmbr = l; nexmplr = k1; nasspr = 0; ninpt = 0; int i,j,i2; float tmp1,tmp2; 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(); cout<<"\n"; } for(i=0;i<anmbr;++i){ anrn[i].fzneuron::getnrn(i,bnmbr,0,y1);} for(i=0;i<bnmbr;++i){ bnrn[i].fzneuron::getnrn(i,0,anmbr,y2);} for(i=0;i<anmbr;++i){ for(j=0;j<bnmbr;++j){ tmp1 = 0.0; for(i2=0;i2<nexmplr;++i2){ tmp2 = min(e[i2].v1[i],e[i2].v2[j]); tmp1 = max(tmp1,tmp2); } mtrx1[i][j] = tmp1; 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(float *b) { int i,j; 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() //changed from BAM { int j; for(j=0;j<bnmbr;++j){ int ii1; float c1 =0.0,d1; cout<<"\n"; for(ii1=0;ii1<anmbr;++ii1){ d1 = min(outs1[ii1],mtrx1[ii1][j]); c1 = max(c1,d1); } bnrn[j].activation = c1; cout<<"\n output layer neuron "<<j<<" activation is " <<c1<<"\n"; bnrn[j].output = bnrn[j].activation; outs2[j] = bnrn[j].output; cout<<"\n output layer neuron "<<j<<" output is " <<bnrn[j].output<<"\n"; } } void network::comput2() //changed from BAM { int i; for(i=0;i<anmbr;++i){ int ii1; float c1=0.0,d1; for(ii1=0;ii1<bnmbr;++ii1){ d1 = min(outs2[ii1],mtrx2[ii1][i]); c1 = max(c1,d1);} anrn[i].activation = c1; cout<<"\ninput layer neuron "<<i<<"activation is " <<c1<<"\n"; anrn[i].output = anrn[i].activation; outs1[i] = anrn[i].output; cout<<"\n input layer neuron "<<i<<"output is " <<anrn[i].output<<"\n"; } } void network::asgnvect(int j1,float *b1,float *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(float *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 FUZZY AM\n\n"; for(j=1;j<=nasspr;++j){ as[j].prasscpair(); cout<<"\n";} } void main() { int ar = 6, br = 4, nex = 1; float inptv[][6]={0.1,0.3,0.2,0.0,0.7,0.5,0.6,0.0,0.3,0.4,0.1,0.2}; float outv[][4]={0.4,0.2,0.1,0.0}; cout<<"\n\nTHIS PROGRAM IS FOR A FUZZY ASSOCIATIVE MEMORY NETWORK. THE NETWORK \n"; cout<<"IS SET UP FOR ILLUSTRATION WITH "<<ar<<" INPUT NEURONS, AND "<<br; cout<<" OUTPUT NEURONS.\n"<<nex<<" exemplars are used to encode \n"; static network famn; famn.getnwk(ar,br,nex,inptv,outv); famn.iterate(); famn.findassc(inptv[1]); famn.prstatus(); }
Previous | Table of Contents | Next |