115.

c++ neural networks and fuzzy logic 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


Source File for Hopfield Network for Traveling Salesperson Problem

The following listing gives the source code for the C++ program for the Hopfield network for traveling salesperson problem. The user is prompted to input the number of cities and the maximum number of iterations for the operation of the network.

The parameters a, b, c, d declared in the function main correspond to A1, A2, A3, and A4, respectively. These and the parameters tau, lambda, and nprm are all given values in the declaration statements in the function main. If you change these parameter values or change the number of cities in the traveling salesperson problem, the program will compile but may not work as you’d like.

Listing 15.2 Source file for the C++ program for the Hopfield network for the traveling salesperson problem

 //trvslsmn.cpp V. Rao,  H. Rao #include “trvslsmn.h” #include <stdlib.h> #include <time.h> //generate random noise int randomnum(int maxval) { // random number generator // will return an integer up to maxval return rand() % maxval; } //Kronecker delta function int krondelt(int i,int j)        {        int k;        k= ((i == j) ? (1):(0));        return k;        }; void tsneuron::getnrn(int i,int j)        {        cit = i;        ord = j;        output = 0.0;        activation = 0.0;        }; //distances between cities void network::getdist(int k)        {        citnbr = k;        int i,j;        cout<<”\n”; for(i=0;i<citnbr;++i)        {        dist[i][i]=0;        for(j=i+1;j<citnbr;++j)               {               cout<<”\ntype distance (integer) from city “<<               i<<” to city “<<j<<”\n”;               cin>>dist[i][j];               }        cout<<”\n”;        } for(i=0;i<citnbr;++i)        {        for(j=0;j<i;++j)               {               dist[i][j] = dist[j][i];               }        } prdist(); cout<<”\n”; } //print distance matrix void network::prdist()        {        int i,j;        cout<<”\n Distance Matrix\n”;        for(i=0;i<citnbr;++i)               {               for(j=0;j<citnbr;++j)                      {                      cout<<dist[i][j]<<”  “;                      }        cout<<”\n”;        } } //set up network void network::getnwk(int citynum,float a,float b,float c,float d)         {         int i,j,k,l,t1,t2,t3,t4,t5,t6;         int p,q;         citnbr = citynum;         pra = a;         prb = b;         prc = c;         prd = d;         getdist(citnbr);         for(i=0;i<citnbr;++i)                 {                 for(j=0;j<citnbr;++j)                        {                        tnrn[i][j].getnrn(i,j);                        }                 }         //find weight matrix         for(i=0;i<citnbr;++i)                  {                  for(j=0;j<citnbr;++j)                         {                         p = ((j == citnbr-1) ? (0) : (j+1));                         q = ((j == 0) ? (citnbr-1) : (j-1));                         t1 = j + i*citnbr;                         for(k=0;k<citnbr;++k)                                 {                  for(l=0;l<citnbr;++l)                         {                         t2 = l + k*citnbr;                         t3 = krondelt(i,k);                         t4 = krondelt(j,l);                         t5 = krondelt(l,p);                         t6 = krondelt(l,q);                         mtrx[t1][t2] =                         -a*t3*(1-t4) -b*t4*(1-t3)                         -c -d*dist[i][k]*(t5+t6);             }                  }             }         }         prmtrx(citnbr); } //print weight matrix void network::prmtrx(int k)          {          int i,j,nbrsq;          nbrsq = k*k;          cout<<”\nWeight Matrix\n”;          for(i=0;i<nbrsq;++i)                 {                 for(j=0;j<nbrsq;++j)                        {                        if(j%k == 0)                               {                               cout<<”\n”;                               }                        cout<<mtrx[i][j]<<”  “;                        }                 cout<<”\n”;                 }          } //present input to network void network::asgninpt(float *ip)        {        int i,j,k,l,t1,t2;        for(i=0;i<citnbr;++i)              {              for(j =0;j<citnbr;++j)                     {                     acts[i][j] = 0.0;                     }              }        //find initial activations        for(i=0;i<citnbr;++i)              {              for(j =0;j<citnbr;++j)                     {                     t1 = j + i*citnbr;                     for(k=0;k<citnbr;++k)                            {                            for(l=0;l<citnbr;++l)                                   {                                   t2 = l + k*citnbr;                                   acts[i][j] +=                                   mtrx[t1][t2]*ip[t1];                                   }                            }                     }              }        //print activations        cout<<”\ninitial activations\n”;        practs();        } //find activations void network::getacts(int nprm,float dlt,float tau)        {        int i,j,k,p,q;        float r1, r2, r3, r4,r5;        r3 = totout - nprm ;        for(i=0;i<citnbr;++i)              {              r4 = 0.0;              p = ((i == citnbr-1) ? (0) : (i+1));              q = ((i == 0) ? (citnbr-1) : (i-1));              for(j=0;j<citnbr;++j)                     {                     r1 = citouts[i] - outs[i][j];                     r2 = ordouts[i] - outs[i][j];                     for(k=0;k<citnbr;++k)                            {                            r4 += dist[i][k] *                            (outs[k][p] + outs[k][q]);                            }                     r5 = dlt*(-acts[i][j]/tau -                     pra*r1 -prb*r2 -prc*r3 -prd*r4);                     acts[i][j] += r5;                     }              }        } //find outputs and totals for rows and columns void network::getouts(float la)        {        float b1,b2,b3,b4;        int i,j;        totout = 0.0;        for(i=0;i<citnbr;++i)              {              citouts[i] = 0.0;              for(j=0;j<citnbr;++j)              {              b1 = la*acts[i][j];              b4 = b1/500.0;              b2 = exp(b4);              b3 = exp(-b4);              outs[i][j] = (1.0+(b2-b3)/(b2+b3))/2.0;              citouts[i] += outs[i][j];};              totout += citouts[i];              }        for(j=0;j<citnbr;++j)              {              ordouts[j]  = 0.0;              for(i=0;i<citnbr;++i)                     {                     ordouts[j] += outs[i][j];                     }              }        } //find tour void network::findtour()        {        int i,j,k,tag[MXSIZ][MXSIZ];        float tmp;        for (i=0;i<citnbr;++i)               {               for(j=0;j<citnbr;++j)                      {                      tag[i][j] = 0;                      }               }               for (i=0;i<citnbr;++i)                      {                      tmp = -10.0;                      for(j=0;j<citnbr;++j)                            {                            for(k=0;k<citnbr;++k)                                  {                                  if((outs[i][k] >=tmp)&&                                  (tag[i][k] ==0))                                         tmp = outs[i][k];                                  }                            if((outs[i][j] ==tmp)&&                            (tag[i][j]==0))                                  {                                  tourcity[i] =j;                                  tourorder[j] = i;                                  cout<<”\ntourcity “<<i                                  <<” tour order “<<j<<”\n”;                                  for(k=0;k<citnbr;++k)                                         {                                         tag[i][k] = 1;                                         tag[k][j] = 1;                                         }                                  }                            }                      }               } //print outputs void network::prouts()        {        int i,j;        cout<<”\nthe outputs\n”;        for(i=0;i<citnbr;++i)               {               for(j=0;j<citnbr;++j)                      {                      cout<<outs[i][j]<<”  “;                      }               cout<<”\n”;               }        } //calculate total distance for tour void network::calcdist()        {        int i, k, l;        distnce = 0.0;        for(i=0;i<citnbr;++i)               {               k = tourorder[i];               l = ((i == citnbr-1 ) ? (tourorder[0]):(tourorder[i+1]));               distnce += dist[k][l];               }        cout<<”\n distance of tour is : “<<distnce<<”\n”;        } // print tour void network::prtour()        {        int i;        cout<<”\n the tour :\n”;        for(i=0;i<citnbr;++i)               {               cout<<tourorder[i]<<”  “;               cout<<”\n”;               }        } //print activations void network::practs()        {        int i,j;        cout<<”\n the activations:\n”;        for(i=0;i<citnbr;++i)               {               for(j=0;j<citnbr;++j)                      {                      cout<<acts[i][j]<<”  “;                      }               cout<<”\n”;               }        } //iterate specified number of times void network::iterate(int nit,int nprm,float dlt,float tau,float la)        {        int k;        for(k=1;k<=nit;++k)               {               getacts(nprm,dlt,tau);               getouts(la);               }        cout<<”\n” <<nit<<” iterations completed\n”;        practs();        cout<<”\n”;        prouts();        cout<<”\n”;        } void main() { //numit = #iterations; n = #cities; u=intial input; nprm - parameter n’ //dt = delta t; // —————————————————- // parameters to be tuned are here:        int u=1;        int nprm=10;        float a=40.0;        float b=40.0;        float c=30.0;        float d=60.0;        float dt=0.01;        float tau=1.0;        float lambda=3.0; //——————————————————-        int i,n2;        int numit=100;        int n=4;        float input_vector[MXSIZ*MXSIZ];        srand ((unsigned)time(NULL));        cout<<”\nPlease type number of cities, number of iterations\n”;        cin>>n>>numit;        cout<<”\n”;        if (n>MXSIZ)               {               cout << “choose a smaller n value\n”;               exit(1);               }        n2 = n*n;        for(i=0;i<n2;++i)               {               if(i%n == 0)cout<<”\n”;               input_vector[i] =(u + (float)(randomnum(100)/100.0))/20.0;               cout<<input_vector[i]<<” “;               } //create network and operate        network *tntwk = new network;        if (tntwk==0)               {               cout << “not enough memory\n”;               exit(1);               }        tntwk->getnwk(n,a,b,c,d);        tntwk->asgninpt(input_vector);        tntwk->getouts(lambda);        tntwk->prouts();        tntwk->iterate(numit,nprm,dt,tau,lambda);        tntwk->findtour();        tntwk->prtour();        tntwk->calcdist();        cout<<”\n”; } 


Previous Table of Contents Next

Copyright © IDG Books Worldwide, Inc.



C++ Neural Networks and Fuzzy Logic
C++ Neural Networks and Fuzzy Logic
ISBN: 1558515526
EAN: 2147483647
Year: 1995
Pages: 139

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net