Implement any scheme to find the optimal solution for the travelling salesman problem

Travelling Salesman Problem Using Nearest Neighbour Algorithm in C
The Nearest Neighbour (NN) algorithm is a greedy heuristic method for solving the Travelling Salesman Problem (TSP). Though it doesn’t guarantee the optimal solution, it provides a quick and fairly efficient approximation, especially useful for large datasets where brute-force or dynamic programming becomes infeasible.
/* Nearest neighbour algorithm for travelling sales person*/ #include<stdio.h> #include<conio.h> #define MAX 100 #define INFINTIY 999 int n, a[MAX][MAX]; int visited[MAX], nn_cost=0; void get_distance() { int i,j; //for dynamic data /* printf("Enter no. of cities:\n"); scanf("%d", &n); printf("\n Enter cost Matrix: \n"); for(i=0;i<n;i++) { printf("\n Enter Elements of Row #: %d (999 for no connectivity)\n", i+1); for(j=0;j<n;j++) scanf("%d, &a[i][j]); visited[i] = 0;//for nn method } */ n = 4; a[0][0] = INFINITY; a[0][1] = 1; a[0][2] = 3; a[0][3] = 6; a[1][0] = 1; a[1][1] = INFINITY; a[1][2] = 2; a[1][3] = 3; a[2][0] = 3; a[2][1] = 2; a[2][2] = INFINITY; a[2][3] = 1; a[3][0] = 6; a[3][1] = 3; a[3][2] = 1; a[3][3] = INFINITY; Visited[0] = 0; Visited[1] = 0; Visited[2] = 0; Visited[3] = 0; printf("\n\n The cost list is:\n\n"); for(i=0;i<n;i++) { printf("\n\n"); for(j=0;j<n;j++) printf("\t%d",a[i][j]); } } int least(int c) { int i, nc=INFINITY; int min=INFINITY; for(i=0;i<n;i++) { if((a[c][i] !=0) && (visited[i] == 0)) if(a[c][i]<min) { //min = a[i][0]+a[c][i]; min = a[c][i]; nc = i; } } if(min != INFINITY) nn_cost += min; return nc; } void nn_mincost(int city) { int ncity; visited[city] = 1; printf("%d > ",city); ncity = least(city); if(ncity == INFINITY) { ncity = 0; printf("%d",ncity); nn_cost += a[city][ncity]; return; } nn_mincost(ncity); return; } int tsp_nn() { printf("\n\n The Traversal path using approximation:\n\n"); //min=mincost(0); nn_mincost(0); printf("\n\n Minimum cost is: "); printf("%d", nn_cost); return nn_cost; }
int tsp_dp(int c[][MAX], int tour[], int start, int n) { int i,j,k;//loop counters int temp[MAX];/* Temporary during calculations*/ int mintour[MAX]; /* Minimal tour array*/ int mincost; /*Minimal cost*/ int ccost;/*Current cost*/ /*End of recurssion condition.*/ if(start == n-2) return c[tour[n-2]][tour[n-1]] + c[tour[n-1][0]]; /* Compute the tour starting from the current city.*/ mincost = INFINITY; for(i = start+1; i<n; i++) { for(j=0; j<n; j++) temp[j] = tour[j]; /* Adjust positions*/ temp[start+1] = tour[i]; temp[i] = tour[start+1]; /* Found a better cycle?? (recurrrence derivable)*/ if(c[tour[start]][tour[i]] + (ccost = tsp_dp(c,temp,start+1, n)) < mincost) { mincost = c[tour[start]][tour[i]] + ccost; for(k=0; k<n; k++) mintour[k] = temp[k]; } } /* Set the minimum tour array*/ for(i=0; i<n; i++) tour[i] = mintour[i]; return mincost; } int tsp_dyn() { int i; /*Loop counters*/ int tour[MAX];/* Tour Matrix*/ int dyn_min_cost; /*Least Cost*/ for(i=0;i<n;i++) tour[i] = i; dyn_min_cost = tsp_dp(a, tour, 0,n); printf("\n\n\n Traversal Path using Dynamic Programming: \n\n"); for(i=0;i<n;i++) printf("%d > ", tour[i]); printf("0\n"); printf("\n Minimum cost: %d", dyn_min_cost); return dyn_min_cost; } int main() { int nn_cost,dyn_cost; double err; clrscr(); get_distance(); nn_cost = tsp_nn(); dyn_cost = tsp_dyn(); err = (double)nn_cost/(double)dyn_cost; printf("\n\n\n Error Ratio: %f", err); getch(); return 0; }
OUTPUT The cost matrix list is: 999 1 3 6 1 999 2 3 3 2 999 1 6 3 1 999 The traversal path using approximation: 0>1>2>3>0 Minimum cost is:10 The traversal path using dynamic programming: 0>1>3>2>0 Minimum cost: 8 Error ration: 1.250000