The source code and dockerfile for the GSW2024 AI Lab.
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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 
 
 
 

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;