# include # include # include # include # include # include "tsp_brute.h" int main ( ); void timestamp ( ); void tsp_display ( char *prefix, int n, double *x2 ); /******************************************************************************/ int main ( ) /******************************************************************************/ /* Purpose: tsp_brute_test() tests tsp_brute(). Licensing: This code is distributed under the MIT license. Modified: 18 June 2026 Author: John Burkardt */ { # define N 12 double cost; int i; int i2; int n = N; int *order; char prefix[] = "att12"; double x[N*2] = { 6734, 1453, 2233, 10, 5530, 1424, 401, 841, 3082, 1644, 7608, 4458, 7573, 3716, 7265, 1268, 6898, 1885, 1112, 2049, 5468, 2606, 5989, 2873 }; double *x2; timestamp ( ); printf ( "\n" ); printf ( "tsp_brute_test()\n" ); printf ( " C version\n" ); printf ( " tsp_brute() solves a traveling salesman problem (TSP)\n" ); printf ( " using brute force.\n" ); /* Get the solution. */ order = ( int * ) malloc ( n * sizeof ( int ) ); tsp_brute ( n, x, &cost, order ); printf ( " Length of optimal path is %g\n", cost ); /* Display final path. */ x2 = ( double * ) malloc ( n * 2 * sizeof ( double ) ); for ( i = 0; i < n; i++ ) { i2 = order[i]; x2[2*i] = x[2*i2]; x2[2*i+1] = x[2*i2+1]; } /* Send the data to the plotter. */ tsp_display ( prefix, n, x2 ); free ( x2 ); /* Terminate. */ printf ( "\n" ); printf ( "tsp_brute_test():\n" ); printf ( " Normal end of execution.\n" ); timestamp ( ); return 0; } /******************************************************************************/ void timestamp ( ) /******************************************************************************/ /* Purpose: timestamp() prints the current YMDHMS date as a time stamp. Example: 17 June 2014 09:45:54 AM Licensing: This code is distributed under the MIT license. Modified: 01 May 2021 Author: John Burkardt */ { # define TIME_SIZE 40 static char time_buffer[TIME_SIZE]; const struct tm *tm; time_t now; now = time ( NULL ); tm = localtime ( &now ); strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm ); printf ( "%s\n", time_buffer ); return; # undef TIME_SIZE } /******************************************************************************/ void tsp_display ( char *prefix, int n, double *x2 ) /******************************************************************************/ /* Purpose: tsp_display() plots cities and a tour connecting them. Discussion: The code will automatically include a final step that returns to the first city. Licensing: This code is distributed under the MIT license. Modified: 27 July 2026 Author: John Burkardt Input: char *prefix: a string that defines the name of the problem. It is also used to create file names needed for input to gnuplot. int n: the number of cities. double x[n*2]: the x and y coordinates of the cities. */ { char command_filename[80]; FILE *command; FILE *data; char data_filename[80]; int i; /* Create the data file. */ strcpy ( data_filename, prefix ); strcat ( data_filename, "_data.txt" ); data = fopen ( data_filename, "wt" ); for ( i = 0; i < n; i++ ) { fprintf ( data, "%14.6g %14.6g\n", x2[2*i], x2[2*i+1] ); } i = 0; fprintf ( data, "%14.6g %14.6g\n", x2[2*i], x2[2*i+1] ); fclose ( data ); printf ( " Created data file '%s'\n", data_filename ); /* Create the command file. */ strcpy ( command_filename, prefix ); strcat ( command_filename, "_commands.txt" ); command = fopen ( command_filename, "wt" ); fprintf ( command, "# %s\n", command_filename ); fprintf ( command, "#\n" ); fprintf ( command, "# Usage:\n" ); fprintf ( command, "# gnuplot < %s\n", command_filename ); fprintf ( command, "#\n" ); fprintf ( command, "set term png\n" ); fprintf ( command, "set output '%s.png'\n", prefix ); fprintf ( command, "set xlabel '<--- X --->'\n" ); fprintf ( command, "set ylabel '<--- Y --->'\n" ); fprintf ( command, "set title '%s'\n", prefix ); fprintf ( command, "set grid\n" ); fprintf ( command, "unset key\n" ); fprintf ( command, "set style data lines\n" ); fprintf ( command, "plot '%s' using 1:2 lw 3 linecolor rgb 'blue', \\\n", data_filename ); fprintf ( command, " '%s' using 1:2 with points pointtype 7 pointsize 3 linecolor rgb 'green'\n", data_filename ); fprintf ( command, "quit\n" ); fclose ( command ); printf ( " Created command file '%s'\n", command_filename ); return; }