/* * File: tsp.c * Purpose: Tests the naive O(n!) TSP algorithm. * Compilation: gcc -o tsp tsp.c * Execution: ./tsp * Author: San Skulrattanakulchai */ #include #include #include #define NUM_CITIES 11 static int dist[][NUM_CITIES] = { {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, {9, 0, 8, 7, 6, 5, 4, 3, 10, 1, 2}, {8, 7, 0, 6, 5, 4, 3, 2, 9, 10, 1}, {7, 6, 5, 0, 4, 3, 2, 1, 8, 9, 10}, {4, 3, 2, 1, 0, 10, 9, 8, 7, 6, 5}, {10, 9, 8, 7, 6, 0, 5, 4, 3, 2, 1}, {7, 8, 9, 10, 1, 2, 0, 3, 4, 5, 6}, {5, 4, 3, 2, 1, 6, 7, 0, 8, 9, 10}, {10, 9, 8, 7, 6, 5, 4, 3, 0, 2, 1}, {1, 2, 4, 3, 6, 5, 8, 7, 10, 0, 9}, {3, 2, 1, 6, 5, 4, 9, 8, 7, 10, 0} }; static int *pi; static int minDist; void swap(int a[], int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } void perm(int i) { int j; if (i == NUM_CITIES-1) { int d = dist[pi[NUM_CITIES-1]][0]; for (j = 0; j < NUM_CITIES-1; j++) d = d + dist[pi[j]][pi[j+1]]; if (d < minDist) minDist = d; } else for (j = i; j < NUM_CITIES; j++) { swap(pi, i, j); perm(i+1); swap(pi, i, j); } } void tsp() { int i; pi = malloc(NUM_CITIES * sizeof(int)); for (i = 0; i < NUM_CITIES; i++) pi[i] = i; minDist = INT_MAX; perm(1); printf("minimum tour length = %d\n", minDist); } int main(int argc, char **argv) { tsp(); return 0; }