[9] | 1 | /* TSP, Traveling Salesman Problem */ |
---|
| 2 | |
---|
| 3 | /* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */ |
---|
| 4 | |
---|
| 5 | /* The Traveling Salesman Problem (TSP) is stated as follows. |
---|
| 6 | Let a directed graph G = (V, E) be given, where V = {1, ..., n} is |
---|
| 7 | a set of nodes, E <= V x V is a set of arcs. Let also each arc |
---|
| 8 | e = (i,j) be assigned a number c[i,j], which is the length of the |
---|
| 9 | arc e. The problem is to find a closed path of minimal length going |
---|
| 10 | through each node of G exactly once. */ |
---|
| 11 | |
---|
| 12 | param n, integer, >= 3; |
---|
| 13 | /* number of nodes */ |
---|
| 14 | |
---|
| 15 | set V := 1..n; |
---|
| 16 | /* set of nodes */ |
---|
| 17 | |
---|
| 18 | set E, within V cross V; |
---|
| 19 | /* set of arcs */ |
---|
| 20 | |
---|
| 21 | param c{(i,j) in E}; |
---|
| 22 | /* distance from node i to node j */ |
---|
| 23 | |
---|
| 24 | var x{(i,j) in E}, binary; |
---|
| 25 | /* x[i,j] = 1 means that the salesman goes from node i to node j */ |
---|
| 26 | |
---|
| 27 | minimize total: sum{(i,j) in E} c[i,j] * x[i,j]; |
---|
| 28 | /* the objective is to make the path length as small as possible */ |
---|
| 29 | |
---|
| 30 | s.t. leave{i in V}: sum{(i,j) in E} x[i,j] = 1; |
---|
| 31 | /* the salesman leaves each node i exactly once */ |
---|
| 32 | |
---|
| 33 | s.t. enter{j in V}: sum{(i,j) in E} x[i,j] = 1; |
---|
| 34 | /* the salesman enters each node j exactly once */ |
---|
| 35 | |
---|
| 36 | /* Constraints above are not sufficient to describe valid tours, so we |
---|
| 37 | need to add constraints to eliminate subtours, i.e. tours which have |
---|
| 38 | disconnected components. Although there are many known ways to do |
---|
| 39 | that, I invented yet another way. The general idea is the following. |
---|
| 40 | Let the salesman sells, say, cars, starting the travel from node 1, |
---|
| 41 | where he has n cars. If we require the salesman to sell exactly one |
---|
| 42 | car in each node, he will need to go through all nodes to satisfy |
---|
| 43 | this requirement, thus, all subtours will be eliminated. */ |
---|
| 44 | |
---|
| 45 | var y{(i,j) in E}, >= 0; |
---|
| 46 | /* y[i,j] is the number of cars, which the salesman has after leaving |
---|
| 47 | node i and before entering node j; in terms of the network analysis, |
---|
| 48 | y[i,j] is a flow through arc (i,j) */ |
---|
| 49 | |
---|
| 50 | s.t. cap{(i,j) in E}: y[i,j] <= (n-1) * x[i,j]; |
---|
| 51 | /* if arc (i,j) does not belong to the salesman's tour, its capacity |
---|
| 52 | must be zero; it is obvious that on leaving a node, it is sufficient |
---|
| 53 | to have not more than n-1 cars */ |
---|
| 54 | |
---|
| 55 | s.t. node{i in V}: |
---|
| 56 | /* node[i] is a conservation constraint for node i */ |
---|
| 57 | |
---|
| 58 | sum{(j,i) in E} y[j,i] |
---|
| 59 | /* summary flow into node i through all ingoing arcs */ |
---|
| 60 | |
---|
| 61 | + (if i = 1 then n) |
---|
| 62 | /* plus n cars which the salesman has at starting node */ |
---|
| 63 | |
---|
| 64 | = /* must be equal to */ |
---|
| 65 | |
---|
| 66 | sum{(i,j) in E} y[i,j] |
---|
| 67 | /* summary flow from node i through all outgoing arcs */ |
---|
| 68 | |
---|
| 69 | + 1; |
---|
| 70 | /* plus one car which the salesman sells at node i */ |
---|
| 71 | |
---|
| 72 | solve; |
---|
| 73 | |
---|
| 74 | printf "Optimal tour has length %d\n", |
---|
| 75 | sum{(i,j) in E} c[i,j] * x[i,j]; |
---|
| 76 | printf("From node To node Distance\n"); |
---|
| 77 | printf{(i,j) in E: x[i,j]} " %3d %3d %8g\n", |
---|
| 78 | i, j, c[i,j]; |
---|
| 79 | |
---|
| 80 | data; |
---|
| 81 | |
---|
| 82 | /* These data correspond to the symmetric instance ulysses16 from: |
---|
| 83 | |
---|
| 84 | Reinelt, G.: TSPLIB - A travelling salesman problem library. |
---|
| 85 | ORSA-Journal of the Computing 3 (1991) 376-84; |
---|
| 86 | http://elib.zib.de/pub/Packages/mp-testdata/tsp/tsplib */ |
---|
| 87 | |
---|
| 88 | /* The optimal solution is 6859 */ |
---|
| 89 | |
---|
| 90 | param n := 16; |
---|
| 91 | |
---|
| 92 | param : E : c := |
---|
| 93 | 1 2 509 |
---|
| 94 | 1 3 501 |
---|
| 95 | 1 4 312 |
---|
| 96 | 1 5 1019 |
---|
| 97 | 1 6 736 |
---|
| 98 | 1 7 656 |
---|
| 99 | 1 8 60 |
---|
| 100 | 1 9 1039 |
---|
| 101 | 1 10 726 |
---|
| 102 | 1 11 2314 |
---|
| 103 | 1 12 479 |
---|
| 104 | 1 13 448 |
---|
| 105 | 1 14 479 |
---|
| 106 | 1 15 619 |
---|
| 107 | 1 16 150 |
---|
| 108 | 2 1 509 |
---|
| 109 | 2 3 126 |
---|
| 110 | 2 4 474 |
---|
| 111 | 2 5 1526 |
---|
| 112 | 2 6 1226 |
---|
| 113 | 2 7 1133 |
---|
| 114 | 2 8 532 |
---|
| 115 | 2 9 1449 |
---|
| 116 | 2 10 1122 |
---|
| 117 | 2 11 2789 |
---|
| 118 | 2 12 958 |
---|
| 119 | 2 13 941 |
---|
| 120 | 2 14 978 |
---|
| 121 | 2 15 1127 |
---|
| 122 | 2 16 542 |
---|
| 123 | 3 1 501 |
---|
| 124 | 3 2 126 |
---|
| 125 | 3 4 541 |
---|
| 126 | 3 5 1516 |
---|
| 127 | 3 6 1184 |
---|
| 128 | 3 7 1084 |
---|
| 129 | 3 8 536 |
---|
| 130 | 3 9 1371 |
---|
| 131 | 3 10 1045 |
---|
| 132 | 3 11 2728 |
---|
| 133 | 3 12 913 |
---|
| 134 | 3 13 904 |
---|
| 135 | 3 14 946 |
---|
| 136 | 3 15 1115 |
---|
| 137 | 3 16 499 |
---|
| 138 | 4 1 312 |
---|
| 139 | 4 2 474 |
---|
| 140 | 4 3 541 |
---|
| 141 | 4 5 1157 |
---|
| 142 | 4 6 980 |
---|
| 143 | 4 7 919 |
---|
| 144 | 4 8 271 |
---|
| 145 | 4 9 1333 |
---|
| 146 | 4 10 1029 |
---|
| 147 | 4 11 2553 |
---|
| 148 | 4 12 751 |
---|
| 149 | 4 13 704 |
---|
| 150 | 4 14 720 |
---|
| 151 | 4 15 783 |
---|
| 152 | 4 16 455 |
---|
| 153 | 5 1 1019 |
---|
| 154 | 5 2 1526 |
---|
| 155 | 5 3 1516 |
---|
| 156 | 5 4 1157 |
---|
| 157 | 5 6 478 |
---|
| 158 | 5 7 583 |
---|
| 159 | 5 8 996 |
---|
| 160 | 5 9 858 |
---|
| 161 | 5 10 855 |
---|
| 162 | 5 11 1504 |
---|
| 163 | 5 12 677 |
---|
| 164 | 5 13 651 |
---|
| 165 | 5 14 600 |
---|
| 166 | 5 15 401 |
---|
| 167 | 5 16 1033 |
---|
| 168 | 6 1 736 |
---|
| 169 | 6 2 1226 |
---|
| 170 | 6 3 1184 |
---|
| 171 | 6 4 980 |
---|
| 172 | 6 5 478 |
---|
| 173 | 6 7 115 |
---|
| 174 | 6 8 740 |
---|
| 175 | 6 9 470 |
---|
| 176 | 6 10 379 |
---|
| 177 | 6 11 1581 |
---|
| 178 | 6 12 271 |
---|
| 179 | 6 13 289 |
---|
| 180 | 6 14 261 |
---|
| 181 | 6 15 308 |
---|
| 182 | 6 16 687 |
---|
| 183 | 7 1 656 |
---|
| 184 | 7 2 1133 |
---|
| 185 | 7 3 1084 |
---|
| 186 | 7 4 919 |
---|
| 187 | 7 5 583 |
---|
| 188 | 7 6 115 |
---|
| 189 | 7 8 667 |
---|
| 190 | 7 9 455 |
---|
| 191 | 7 10 288 |
---|
| 192 | 7 11 1661 |
---|
| 193 | 7 12 177 |
---|
| 194 | 7 13 216 |
---|
| 195 | 7 14 207 |
---|
| 196 | 7 15 343 |
---|
| 197 | 7 16 592 |
---|
| 198 | 8 1 60 |
---|
| 199 | 8 2 532 |
---|
| 200 | 8 3 536 |
---|
| 201 | 8 4 271 |
---|
| 202 | 8 5 996 |
---|
| 203 | 8 6 740 |
---|
| 204 | 8 7 667 |
---|
| 205 | 8 9 1066 |
---|
| 206 | 8 10 759 |
---|
| 207 | 8 11 2320 |
---|
| 208 | 8 12 493 |
---|
| 209 | 8 13 454 |
---|
| 210 | 8 14 479 |
---|
| 211 | 8 15 598 |
---|
| 212 | 8 16 206 |
---|
| 213 | 9 1 1039 |
---|
| 214 | 9 2 1449 |
---|
| 215 | 9 3 1371 |
---|
| 216 | 9 4 1333 |
---|
| 217 | 9 5 858 |
---|
| 218 | 9 6 470 |
---|
| 219 | 9 7 455 |
---|
| 220 | 9 8 1066 |
---|
| 221 | 9 10 328 |
---|
| 222 | 9 11 1387 |
---|
| 223 | 9 12 591 |
---|
| 224 | 9 13 650 |
---|
| 225 | 9 14 656 |
---|
| 226 | 9 15 776 |
---|
| 227 | 9 16 933 |
---|
| 228 | 10 1 726 |
---|
| 229 | 10 2 1122 |
---|
| 230 | 10 3 1045 |
---|
| 231 | 10 4 1029 |
---|
| 232 | 10 5 855 |
---|
| 233 | 10 6 379 |
---|
| 234 | 10 7 288 |
---|
| 235 | 10 8 759 |
---|
| 236 | 10 9 328 |
---|
| 237 | 10 11 1697 |
---|
| 238 | 10 12 333 |
---|
| 239 | 10 13 400 |
---|
| 240 | 10 14 427 |
---|
| 241 | 10 15 622 |
---|
| 242 | 10 16 610 |
---|
| 243 | 11 1 2314 |
---|
| 244 | 11 2 2789 |
---|
| 245 | 11 3 2728 |
---|
| 246 | 11 4 2553 |
---|
| 247 | 11 5 1504 |
---|
| 248 | 11 6 1581 |
---|
| 249 | 11 7 1661 |
---|
| 250 | 11 8 2320 |
---|
| 251 | 11 9 1387 |
---|
| 252 | 11 10 1697 |
---|
| 253 | 11 12 1838 |
---|
| 254 | 11 13 1868 |
---|
| 255 | 11 14 1841 |
---|
| 256 | 11 15 1789 |
---|
| 257 | 11 16 2248 |
---|
| 258 | 12 1 479 |
---|
| 259 | 12 2 958 |
---|
| 260 | 12 3 913 |
---|
| 261 | 12 4 751 |
---|
| 262 | 12 5 677 |
---|
| 263 | 12 6 271 |
---|
| 264 | 12 7 177 |
---|
| 265 | 12 8 493 |
---|
| 266 | 12 9 591 |
---|
| 267 | 12 10 333 |
---|
| 268 | 12 11 1838 |
---|
| 269 | 12 13 68 |
---|
| 270 | 12 14 105 |
---|
| 271 | 12 15 336 |
---|
| 272 | 12 16 417 |
---|
| 273 | 13 1 448 |
---|
| 274 | 13 2 941 |
---|
| 275 | 13 3 904 |
---|
| 276 | 13 4 704 |
---|
| 277 | 13 5 651 |
---|
| 278 | 13 6 289 |
---|
| 279 | 13 7 216 |
---|
| 280 | 13 8 454 |
---|
| 281 | 13 9 650 |
---|
| 282 | 13 10 400 |
---|
| 283 | 13 11 1868 |
---|
| 284 | 13 12 68 |
---|
| 285 | 13 14 52 |
---|
| 286 | 13 15 287 |
---|
| 287 | 13 16 406 |
---|
| 288 | 14 1 479 |
---|
| 289 | 14 2 978 |
---|
| 290 | 14 3 946 |
---|
| 291 | 14 4 720 |
---|
| 292 | 14 5 600 |
---|
| 293 | 14 6 261 |
---|
| 294 | 14 7 207 |
---|
| 295 | 14 8 479 |
---|
| 296 | 14 9 656 |
---|
| 297 | 14 10 427 |
---|
| 298 | 14 11 1841 |
---|
| 299 | 14 12 105 |
---|
| 300 | 14 13 52 |
---|
| 301 | 14 15 237 |
---|
| 302 | 14 16 449 |
---|
| 303 | 15 1 619 |
---|
| 304 | 15 2 1127 |
---|
| 305 | 15 3 1115 |
---|
| 306 | 15 4 783 |
---|
| 307 | 15 5 401 |
---|
| 308 | 15 6 308 |
---|
| 309 | 15 7 343 |
---|
| 310 | 15 8 598 |
---|
| 311 | 15 9 776 |
---|
| 312 | 15 10 622 |
---|
| 313 | 15 11 1789 |
---|
| 314 | 15 12 336 |
---|
| 315 | 15 13 287 |
---|
| 316 | 15 14 237 |
---|
| 317 | 15 16 636 |
---|
| 318 | 16 1 150 |
---|
| 319 | 16 2 542 |
---|
| 320 | 16 3 499 |
---|
| 321 | 16 4 455 |
---|
| 322 | 16 5 1033 |
---|
| 323 | 16 6 687 |
---|
| 324 | 16 7 592 |
---|
| 325 | 16 8 206 |
---|
| 326 | 16 9 933 |
---|
| 327 | 16 10 610 |
---|
| 328 | 16 11 2248 |
---|
| 329 | 16 12 417 |
---|
| 330 | 16 13 406 |
---|
| 331 | 16 14 449 |
---|
| 332 | 16 15 636 |
---|
| 333 | ; |
---|
| 334 | |
---|
| 335 | end; |
---|