|
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; |