You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							335 lines
						
					
					
						
							6.5 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							335 lines
						
					
					
						
							6.5 KiB
						
					
					
				
								/* TSP, Traveling Salesman Problem */
							 | 
						|
								
							 | 
						|
								/* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */
							 | 
						|
								
							 | 
						|
								/* The Traveling Salesman Problem (TSP) is stated as follows.
							 | 
						|
								   Let a directed graph G = (V, E) be given, where V = {1, ..., n} is
							 | 
						|
								   a set of nodes, E <= V x V is a set of arcs. Let also each arc
							 | 
						|
								   e = (i,j) be assigned a number c[i,j], which is the length of the
							 | 
						|
								   arc e. The problem is to find a closed path of minimal length going
							 | 
						|
								   through each node of G exactly once. */
							 | 
						|
								
							 | 
						|
								param n, integer, >= 3;
							 | 
						|
								/* number of nodes */
							 | 
						|
								
							 | 
						|
								set V := 1..n;
							 | 
						|
								/* set of nodes */
							 | 
						|
								
							 | 
						|
								set E, within V cross V;
							 | 
						|
								/* set of arcs */
							 | 
						|
								
							 | 
						|
								param c{(i,j) in E};
							 | 
						|
								/* distance from node i to node j */
							 | 
						|
								
							 | 
						|
								var x{(i,j) in E}, binary;
							 | 
						|
								/* x[i,j] = 1 means that the salesman goes from node i to node j */
							 | 
						|
								
							 | 
						|
								minimize total: sum{(i,j) in E} c[i,j] * x[i,j];
							 | 
						|
								/* the objective is to make the path length as small as possible */
							 | 
						|
								
							 | 
						|
								s.t. leave{i in V}: sum{(i,j) in E} x[i,j] = 1;
							 | 
						|
								/* the salesman leaves each node i exactly once */
							 | 
						|
								
							 | 
						|
								s.t. enter{j in V}: sum{(i,j) in E} x[i,j] = 1;
							 | 
						|
								/* the salesman enters each node j exactly once */
							 | 
						|
								
							 | 
						|
								/* Constraints above are not sufficient to describe valid tours, so we
							 | 
						|
								   need to add constraints to eliminate subtours, i.e. tours which have
							 | 
						|
								   disconnected components. Although there are many known ways to do
							 | 
						|
								   that, I invented yet another way. The general idea is the following.
							 | 
						|
								   Let the salesman sell, say, cars, starting the travel from node 1,
							 | 
						|
								   where he has n cars. If we require the salesman to sell exactly one
							 | 
						|
								   car in each node, he will need to go through all nodes to satisfy
							 | 
						|
								   this requirement, thus, all subtours will be eliminated. */
							 | 
						|
								
							 | 
						|
								var y{(i,j) in E}, >= 0;
							 | 
						|
								/* y[i,j] is the number of cars, which the salesman has after leaving
							 | 
						|
								   node i and before entering node j; in terms of the network analysis,
							 | 
						|
								   y[i,j] is a flow through arc (i,j) */
							 | 
						|
								
							 | 
						|
								s.t. cap{(i,j) in E}: y[i,j] <= (n-1) * x[i,j];
							 | 
						|
								/* if arc (i,j) does not belong to the salesman's tour, its capacity
							 | 
						|
								   must be zero; it is obvious that on leaving a node, it is sufficient
							 | 
						|
								   to have not more than n-1 cars */
							 | 
						|
								
							 | 
						|
								s.t. node{i in V}:
							 | 
						|
								/* node[i] is a conservation constraint for node i */
							 | 
						|
								
							 | 
						|
								      sum{(j,i) in E} y[j,i]
							 | 
						|
								      /* summary flow into node i through all ingoing arcs */
							 | 
						|
								
							 | 
						|
								      + (if i = 1 then n)
							 | 
						|
								      /* plus n cars which the salesman has at starting node */
							 | 
						|
								
							 | 
						|
								      = /* must be equal to */
							 | 
						|
								
							 | 
						|
								      sum{(i,j) in E} y[i,j]
							 | 
						|
								      /* summary flow from node i through all outgoing arcs */
							 | 
						|
								
							 | 
						|
								      + 1;
							 | 
						|
								      /* plus one car which the salesman sells at node i */
							 | 
						|
								
							 | 
						|
								solve;
							 | 
						|
								
							 | 
						|
								printf "Optimal tour has length %d\n",
							 | 
						|
								   sum{(i,j) in E} c[i,j] * x[i,j];
							 | 
						|
								printf("From node   To node   Distance\n");
							 | 
						|
								printf{(i,j) in E: x[i,j]} "      %3d       %3d   %8g\n",
							 | 
						|
								   i, j, c[i,j];
							 | 
						|
								
							 | 
						|
								data;
							 | 
						|
								
							 | 
						|
								/* These data correspond to the symmetric instance ulysses16 from:
							 | 
						|
								
							 | 
						|
								   Reinelt, G.: TSPLIB - A travelling salesman problem library.
							 | 
						|
								   ORSA-Journal of the Computing 3 (1991) 376-84;
							 | 
						|
								   http://elib.zib.de/pub/Packages/mp-testdata/tsp/tsplib */
							 | 
						|
								
							 | 
						|
								/* The optimal solution is 6859 */
							 | 
						|
								
							 | 
						|
								param n := 16;
							 | 
						|
								
							 | 
						|
								param : E : c :=
							 | 
						|
								    1  2   509
							 | 
						|
								    1  3   501
							 | 
						|
								    1  4   312
							 | 
						|
								    1  5  1019
							 | 
						|
								    1  6   736
							 | 
						|
								    1  7   656
							 | 
						|
								    1  8    60
							 | 
						|
								    1  9  1039
							 | 
						|
								    1 10   726
							 | 
						|
								    1 11  2314
							 | 
						|
								    1 12   479
							 | 
						|
								    1 13   448
							 | 
						|
								    1 14   479
							 | 
						|
								    1 15   619
							 | 
						|
								    1 16   150
							 | 
						|
								    2  1   509
							 | 
						|
								    2  3   126
							 | 
						|
								    2  4   474
							 | 
						|
								    2  5  1526
							 | 
						|
								    2  6  1226
							 | 
						|
								    2  7  1133
							 | 
						|
								    2  8   532
							 | 
						|
								    2  9  1449
							 | 
						|
								    2 10  1122
							 | 
						|
								    2 11  2789
							 | 
						|
								    2 12   958
							 | 
						|
								    2 13   941
							 | 
						|
								    2 14   978
							 | 
						|
								    2 15  1127
							 | 
						|
								    2 16   542
							 | 
						|
								    3  1   501
							 | 
						|
								    3  2   126
							 | 
						|
								    3  4   541
							 | 
						|
								    3  5  1516
							 | 
						|
								    3  6  1184
							 | 
						|
								    3  7  1084
							 | 
						|
								    3  8   536
							 | 
						|
								    3  9  1371
							 | 
						|
								    3 10  1045
							 | 
						|
								    3 11  2728
							 | 
						|
								    3 12   913
							 | 
						|
								    3 13   904
							 | 
						|
								    3 14   946
							 | 
						|
								    3 15  1115
							 | 
						|
								    3 16   499
							 | 
						|
								    4  1   312
							 | 
						|
								    4  2   474
							 | 
						|
								    4  3   541
							 | 
						|
								    4  5  1157
							 | 
						|
								    4  6   980
							 | 
						|
								    4  7   919
							 | 
						|
								    4  8   271
							 | 
						|
								    4  9  1333
							 | 
						|
								    4 10  1029
							 | 
						|
								    4 11  2553
							 | 
						|
								    4 12   751
							 | 
						|
								    4 13   704
							 | 
						|
								    4 14   720
							 | 
						|
								    4 15   783
							 | 
						|
								    4 16   455
							 | 
						|
								    5  1  1019
							 | 
						|
								    5  2  1526
							 | 
						|
								    5  3  1516
							 | 
						|
								    5  4  1157
							 | 
						|
								    5  6   478
							 | 
						|
								    5  7   583
							 | 
						|
								    5  8   996
							 | 
						|
								    5  9   858
							 | 
						|
								    5 10   855
							 | 
						|
								    5 11  1504
							 | 
						|
								    5 12   677
							 | 
						|
								    5 13   651
							 | 
						|
								    5 14   600
							 | 
						|
								    5 15   401
							 | 
						|
								    5 16  1033
							 | 
						|
								    6  1   736
							 | 
						|
								    6  2  1226
							 | 
						|
								    6  3  1184
							 | 
						|
								    6  4   980
							 | 
						|
								    6  5   478
							 | 
						|
								    6  7   115
							 | 
						|
								    6  8   740
							 | 
						|
								    6  9   470
							 | 
						|
								    6 10   379
							 | 
						|
								    6 11  1581
							 | 
						|
								    6 12   271
							 | 
						|
								    6 13   289
							 | 
						|
								    6 14   261
							 | 
						|
								    6 15   308
							 | 
						|
								    6 16   687
							 | 
						|
								    7  1   656
							 | 
						|
								    7  2  1133
							 | 
						|
								    7  3  1084
							 | 
						|
								    7  4   919
							 | 
						|
								    7  5   583
							 | 
						|
								    7  6   115
							 | 
						|
								    7  8   667
							 | 
						|
								    7  9   455
							 | 
						|
								    7 10   288
							 | 
						|
								    7 11  1661
							 | 
						|
								    7 12   177
							 | 
						|
								    7 13   216
							 | 
						|
								    7 14   207
							 | 
						|
								    7 15   343
							 | 
						|
								    7 16   592
							 | 
						|
								    8  1    60
							 | 
						|
								    8  2   532
							 | 
						|
								    8  3   536
							 | 
						|
								    8  4   271
							 | 
						|
								    8  5   996
							 | 
						|
								    8  6   740
							 | 
						|
								    8  7   667
							 | 
						|
								    8  9  1066
							 | 
						|
								    8 10   759
							 | 
						|
								    8 11  2320
							 | 
						|
								    8 12   493
							 | 
						|
								    8 13   454
							 | 
						|
								    8 14   479
							 | 
						|
								    8 15   598
							 | 
						|
								    8 16   206
							 | 
						|
								    9  1  1039
							 | 
						|
								    9  2  1449
							 | 
						|
								    9  3  1371
							 | 
						|
								    9  4  1333
							 | 
						|
								    9  5   858
							 | 
						|
								    9  6   470
							 | 
						|
								    9  7   455
							 | 
						|
								    9  8  1066
							 | 
						|
								    9 10   328
							 | 
						|
								    9 11  1387
							 | 
						|
								    9 12   591
							 | 
						|
								    9 13   650
							 | 
						|
								    9 14   656
							 | 
						|
								    9 15   776
							 | 
						|
								    9 16   933
							 | 
						|
								   10  1   726
							 | 
						|
								   10  2  1122
							 | 
						|
								   10  3  1045
							 | 
						|
								   10  4  1029
							 | 
						|
								   10  5   855
							 | 
						|
								   10  6   379
							 | 
						|
								   10  7   288
							 | 
						|
								   10  8   759
							 | 
						|
								   10  9   328
							 | 
						|
								   10 11  1697
							 | 
						|
								   10 12   333
							 | 
						|
								   10 13   400
							 | 
						|
								   10 14   427
							 | 
						|
								   10 15   622
							 | 
						|
								   10 16   610
							 | 
						|
								   11  1  2314
							 | 
						|
								   11  2  2789
							 | 
						|
								   11  3  2728
							 | 
						|
								   11  4  2553
							 | 
						|
								   11  5  1504
							 | 
						|
								   11  6  1581
							 | 
						|
								   11  7  1661
							 | 
						|
								   11  8  2320
							 | 
						|
								   11  9  1387
							 | 
						|
								   11 10  1697
							 | 
						|
								   11 12  1838
							 | 
						|
								   11 13  1868
							 | 
						|
								   11 14  1841
							 | 
						|
								   11 15  1789
							 | 
						|
								   11 16  2248
							 | 
						|
								   12  1   479
							 | 
						|
								   12  2   958
							 | 
						|
								   12  3   913
							 | 
						|
								   12  4   751
							 | 
						|
								   12  5   677
							 | 
						|
								   12  6   271
							 | 
						|
								   12  7   177
							 | 
						|
								   12  8   493
							 | 
						|
								   12  9   591
							 | 
						|
								   12 10   333
							 | 
						|
								   12 11  1838
							 | 
						|
								   12 13    68
							 | 
						|
								   12 14   105
							 | 
						|
								   12 15   336
							 | 
						|
								   12 16   417
							 | 
						|
								   13  1   448
							 | 
						|
								   13  2   941
							 | 
						|
								   13  3   904
							 | 
						|
								   13  4   704
							 | 
						|
								   13  5   651
							 | 
						|
								   13  6   289
							 | 
						|
								   13  7   216
							 | 
						|
								   13  8   454
							 | 
						|
								   13  9   650
							 | 
						|
								   13 10   400
							 | 
						|
								   13 11  1868
							 | 
						|
								   13 12    68
							 | 
						|
								   13 14    52
							 | 
						|
								   13 15   287
							 | 
						|
								   13 16   406
							 | 
						|
								   14  1   479
							 | 
						|
								   14  2   978
							 | 
						|
								   14  3   946
							 | 
						|
								   14  4   720
							 | 
						|
								   14  5   600
							 | 
						|
								   14  6   261
							 | 
						|
								   14  7   207
							 | 
						|
								   14  8   479
							 | 
						|
								   14  9   656
							 | 
						|
								   14 10   427
							 | 
						|
								   14 11  1841
							 | 
						|
								   14 12   105
							 | 
						|
								   14 13    52
							 | 
						|
								   14 15   237
							 | 
						|
								   14 16   449
							 | 
						|
								   15  1   619
							 | 
						|
								   15  2  1127
							 | 
						|
								   15  3  1115
							 | 
						|
								   15  4   783
							 | 
						|
								   15  5   401
							 | 
						|
								   15  6   308
							 | 
						|
								   15  7   343
							 | 
						|
								   15  8   598
							 | 
						|
								   15  9   776
							 | 
						|
								   15 10   622
							 | 
						|
								   15 11  1789
							 | 
						|
								   15 12   336
							 | 
						|
								   15 13   287
							 | 
						|
								   15 14   237
							 | 
						|
								   15 16   636
							 | 
						|
								   16  1   150
							 | 
						|
								   16  2   542
							 | 
						|
								   16  3   499
							 | 
						|
								   16  4   455
							 | 
						|
								   16  5  1033
							 | 
						|
								   16  6   687
							 | 
						|
								   16  7   592
							 | 
						|
								   16  8   206
							 | 
						|
								   16  9   933
							 | 
						|
								   16 10   610
							 | 
						|
								   16 11  2248
							 | 
						|
								   16 12   417
							 | 
						|
								   16 13   406
							 | 
						|
								   16 14   449
							 | 
						|
								   16 15   636
							 | 
						|
								;
							 | 
						|
								
							 | 
						|
								end;
							 |