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.