//**************************************************// // Basic Ant Colony Algorithm for TSP // // C Version // //**************************************************// #include <iostream> #include <fstream.h> #include <math.h> #include <time.h> #include <conio.h> #include <stdlib.h> #include <iomanip.h> #define N 50 //city size #define M 30 //ant number double inittao = 1; double tao[N][N]; double detatao[N][N]; double distance[N][N]; double yita[N][N]; int tabu[M][N]; int route[M][N]; double solution[M]; int bestroute[N]; double BestSolution = 10000000000; double alfa,beta,rou,Q; int NcMax; void initparameter();//initialize the parameters of basic ACA double EvalueSolution(int *a);//evaluate the sotution of TSP,and calculate the length of path void InCityXY(double x[], double y[]);//input the node's coordinates of TSP; void main() { int NC=0,i,j,k; initparameter(); double x[N]; double y[N]; InCityXY(x,y); for(i=0; i<N; i++) for(j=i+1; j<N; j++) { distance[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); distance[i][j]=distance[j][i]; } //calculate the heuristic parameters for(i=0; i<N; i++) for(j=0; j<N; j++) { tao[i][j]=inittao; if(i!=j) yita[i][j]=100/(distance[i][j]+50-int(distance[i][j])%50); } for(k=0; k<M; k++) for(i=0; i<N; i++) route[k][i]=-1; srand(time(NULL)); for(k=0;k<M;k++) { route[k][0]=(k+N)%N; tabu[k][route[k][0]]=1; } //each ant try to find the optimal path do { int s=1; double partsum; double pper; double drand; //ant choose one whole path while (s<N) { for(k=0; k<M ;k++) { int jrand=rand()%3000; drand=double(jrand)/3001; partsum=0;pper=0; for(j=0; j<N; j++) { if(tabu[k][j]==0) partsum+=pow(tao[route[k][s-1]][j],alfa)*pow(yita[route[k][s-1]][j],beta); } for(j=0; j<N; j++) { if(tabu[k][j]==0) pper+=pow(tao[route[k][s-1]][j],alfa)*pow(yita[route[k][s-1]][j],beta)/partsum; if(pper>=drand)break; } tabu[k][j]=1; route[k][s]=j; } s++; } //the pheromone is update for(i=0; i<N; i++) for(j=0; j<N ;j++) { detatao[i][j]=0; } for(k=0;k<M;k++) { solution[k]=EvalueSolution(route[k]); } for(k=1;k<M;k++) if(solution[k]<BestSolution) { BestSolution=solution[k]; for(s=0;s<N;s++) bestroute[s]=route[k][s]; } for(k=0;k<M;k++) { for(s=0;s<N-1;s++) detatao[route[k][s]][route[k][s+1]]+=Q/solution[k]; detatao[route[k][N-1]][route[k][0]]+=Q/solution[k]; } for(i=0;i<N;i++) for(j=0;j<N;j++) { tao[i][j]=rou*tao[i][j]+detatao[i][j]; if(tao[i][j]<0.00001) tao[i][j]=0.0001; if(tao[i][j]>20) tao[i][j]=20; } for(k=0;k<M;k++) for(j=1;j<N;j++) { tabu[k][route[k][j]]=0; route[k][j]=-1; } NC++; }while(NC<NcMax); //output the calculating results ofstream result; result.open("Optimal_Results.dat",ios::app); if(!result) { cout<<"Can't open the Optimal_Results' file/n"; abort(); } result<<"*************************************************"<<endl; result<<"The initialized parameters of ACA are as follows:"<<endl; result<<"alfa="<<alfa<<",beta="<<beta<<endl; result<<"Q="<<Q<<",The maximun iteration number of ACA is:"<<NcMax<<endl; result<<"The evaporation parameter of ACA is:"<<rou<<endl; result<<"The best result is:"<<BestSolution<<endl; result<<"*************************************************"<<endl; for(i=0;i<N;i++) result<<bestroute[i]<<","; result<<endl; result.close(); } //*********************************************// // Function:Evaluate the solution // //*********************************************// double EvalueSolution(int *a) { double dist=0; for(int i=0;i<N;i++) dist+=distance[*(a+(i+N)%N)][*(a+(i+N+1)%N)]; return dist; } //*********************************************// // Function:Set the city coordinates // //*********************************************// void InCityXY(double x[],double y[]) { ifstream inxyfile; inxyfile.open("City_Coordinates.dat",ios::in); if(!inxyfile) { cout<<"Can't open the City_Coordinates' file/n"; abort(); } char ch1,ch2; int i=0,j=0; x[0]=y[0]=0; while (!inxyfile.eof()) { inxyfile.get(ch1); if(ch1>='0'&&ch1<='9') { ch2=ch1; while(ch2>='0'&&ch2<='9') { switch(i) { case 0:break; case 1:x[j]=x[j]*10+(double(ch2)-48);break; case 2:y[j]=y[j]*10+(double(ch2)-48);break; } inxyfile.get(ch2); } } i=(++i)%3; if(i==0&&j<N-1) { j++; x[j]=0; y[j]=0; } } } void initparameter() { alfa=2; beta=5; rou=0.5; Q=20; NcMax=200; }