File: thai.mod

package info (click to toggle)
glpk 4.8-1
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 4,324 kB
  • ctags: 3,283
  • sloc: ansic: 34,984; sh: 322; makefile: 133
file content (135 lines) | stat: -rw-r--r-- 3,488 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# THAI NAVY PROBLEM
#
# This model is used to allocate ships to transport personnel from
# different port to a training center.
#
# Reference: Choypeng P, Puakpong P and Rosenthal R E, Optimal Ship
#            Routing and Personnel Assignment for Naval Recruitment
#            in Thailand, Interfaces, Vol 16, No 4, pp.356-366, 1986.
#
# Translated from GAMS by Andrew Makhorin <mao@mai2.rcnet.ru>

set I;
/* ports */

set J;
/* voyages */

set K;
/* ship classes */

set SC within I cross K;
/* ship capability */

param D{i in I};
/* number of men at port i needing transport */

param SHIPCAP{k in K};
/* ship capacity in men */

param N{k in K};
/* number of ships of class k available */

param A{J, {"DIST"} union I};
/* assignment of ports to voyages */

param W1 := 1.00;
/* ship assignment weight */

param W2 := .01;
/* ship distance traveled weight */

param W3 := .0001;
/* personnel distance travel weight */

set VC within J cross K :=
   {j in J, k in K: forall{i in I: A[j,i]} (i,k) in SC};
/* voyage capability */

var Z{j in J, k in K} integer;
/* number of times voyage (j,k) is used */

var Y{j in J, k in K, i in I} >= 0;
/* number of men transported from port i via voyage (j,k) */

s.t. DEMAND{i in I}:
   sum{j in J, k in K: A[j,i] and (j,k) in VC} Y[j,k,i] >= D[i];
/* pick up all the men at port i */

s.t. VOYCAP{j in J, k in K: (j,k) in VC}:
   sum{i in I: A[j,i]} Y[j,k,i] <= SHIPCAP[k] * Z[j,k];
/* observe variable capacity of voyage (j,k) */

s.t. SHIPLIM{k in K}: sum{j in J: (j,k) in VC} Z[j,k] <= N[k];
/* observe limit of class k */

minimize OBJ:
   W1 * sum{j in J, k in K: (j,k) in VC} Z[j,k] +
   W2 * sum{j in J, k in K: (j,k) in VC} A[j,"DIST"] * Z[j,k] +
   W3 * sum{j in J, k in K, i in I: A[j,i] and (j,k) in VC}
      A[j,"DIST"] * Y[j,k,i];

solve;

printf{1..56} "-"; printf "\n";
printf "Number of men transported:\n\n";
printf "%-12s", "";
for {i in I} printf " %10s", i;
printf "\n";
for {j in J, k in K: sum{i in I} Y[j,k,i] != 0}
{  printf "%-12s", j & "." & k;
   for {i in I} printf " %10d", Y[j,k,i];
   printf "\n";
}
printf{1..56} "-"; printf "\n";
printf "Number of times voyage used:\n\n";
printf "%-12s", "";
for {k in K} printf " %10s", k;
printf "\n";
for {j in J: sum{k in K} Z[j,k] != 0}
{  printf "%-12s", j;
   for {k in K} printf " %10d", Z[j,k];
   printf "\n";
}
printf{1..56} "-"; printf "\n";

data;

set I := CHUMPHON SURAT NAKON SONGKHLA ;

set J := V-01 V-02 V-03 V-04 V-05 V-06 V-07 V-08 V-09 V-10 V-11 V-12
         V-13 V-14 V-15 ;

set K := SMALL MEDIUM LARGE ;

set SC : SMALL MEDIUM LARGE :=
CHUMPHON   +     +      +
SURAT      -     +      +
NAKON      -     +      +
SONGKHLA   -     -      +   ;

param D := CHUMPHON 475, SURAT 659, NAKON 672, SONGKHLA 1123 ;

param SHIPCAP := SMALL 100, MEDIUM 200, LARGE 600 ;

param N := SMALL 2, MEDIUM 3, LARGE 4 ;

param A default 0:
      DIST  CHUMPHON SURAT NAKON SONGKHLA :=
V-01   370     1       .     .      .
V-02   460     .       1     .      .
V-03   600     .       .     1      .
V-04   750     .       .     .      1
V-05   515     1       1     .      .
V-06   640     1       .     1      .
V-07   810     1       .     .      1
V-08   665     .       1     1      .
V-09   665     .       1     .      1
V-10   800     .       .     1      1
V-11   720     1       1     1      .
V-12   860     1       1     .      1
V-13   840     1       .     1      1
V-14   865     .       1     1      1
V-15   920     1       1     1      1     ;

end;