/* TSP, Traveling Salesman Problem */ /* Written in GNU MathProg by Andrew Makhorin */ /* 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 sells, 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;