examples/train.mod
changeset 1 c445c931472f
equal deleted inserted replaced
-1:000000000000 0:7c914ee81f23
       
     1 # TRAIN, a model of railroad passenger car allocation
       
     2 #
       
     3 # References:
       
     4 # Robert Fourer, David M. Gay and Brian W. Kernighan, "A Modeling Language
       
     5 # for Mathematical Programming." Management Science 36 (1990) 519-554.
       
     6 
       
     7 ###  SCHEDULE SETS AND PARAMETERS  ###
       
     8 
       
     9 set cities;
       
    10 
       
    11 set links within {c1 in cities, c2 in cities: c1 <> c2};
       
    12 
       
    13                         # Set of cities, and set of intercity links
       
    14 
       
    15 param last > 0 integer; # Number of time intervals in a day
       
    16 
       
    17 set times := 1..last;   # Set of time intervals in a day
       
    18 
       
    19 set schedule within
       
    20       {c1 in cities, t1 in times,
       
    21        c2 in cities, t2 in times: (c1,c2) in links};
       
    22 
       
    23                         # Member (c1,t1,c2,t2) of this set represents
       
    24                         # a train that leaves city c1 at time t1
       
    25                         # and arrives in city c2 at time t2
       
    26 
       
    27 ###  DEMAND PARAMETERS  ###
       
    28 
       
    29 param section > 0 integer;
       
    30 
       
    31                         # Maximum number of cars in one section of a train
       
    32 
       
    33 param demand {schedule} > 0;
       
    34 
       
    35                         # For each scheduled train:
       
    36                         # the smallest number of cars that
       
    37                         # can meet demand for the train
       
    38 
       
    39 param low {(c1,t1,c2,t2) in schedule} := ceil(demand[c1,t1,c2,t2]);
       
    40 
       
    41                         # Minimum number of cars needed to meet demand
       
    42 
       
    43 param high {(c1,t1,c2,t2) in schedule}
       
    44 
       
    45    := max (2, min (ceil(2*demand[c1,t1,c2,t2]),
       
    46                    section*ceil(demand[c1,t1,c2,t2]/section) ));
       
    47 
       
    48                         # Maximum number of cars allowed on a train:
       
    49                         # 2 if demand is for less than one car;
       
    50                         # otherwise, lesser of
       
    51                         # number of cars needed to hold twice the demand, and
       
    52                         # number of cars in minimum number of sections needed
       
    53 
       
    54 ###  DISTANCE PARAMETERS  ###
       
    55 
       
    56 param dist_table {links} >= 0 default 0.0;
       
    57 
       
    58 param distance {(c1,c2) in links} > 0
       
    59    := if dist_table[c1,c2] > 0 then dist_table[c1,c2] else dist_table[c2,c1];
       
    60 
       
    61                         # Inter-city distances: distance[c1,c2] is miles
       
    62                         # between city c1 and city c2
       
    63 
       
    64 ###  VARIABLES  ###
       
    65 
       
    66 var U 'cars stored' {cities,times} >= 0;
       
    67 
       
    68                         # u[c,t] is the number of unused cars stored
       
    69                         # at city c in the interval beginning at time t
       
    70 
       
    71 var X 'cars in train' {schedule} >= 0;
       
    72 
       
    73                         # x[c1,t1,c2,t2] is the number of cars assigned to
       
    74                         # the scheduled train that leaves c1 at t1 and
       
    75                         # arrives in c2 at t2
       
    76 
       
    77 ###  OBJECTIVES  ###
       
    78 
       
    79 minimize cars:
       
    80        sum {c in cities} U[c,last] +
       
    81        sum {(c1,t1,c2,t2) in schedule: t2 < t1} X[c1,t1,c2,t2];
       
    82 
       
    83                         # Number of cars in the system:
       
    84                         # sum of unused cars and cars in trains during
       
    85                         # the last time interval of the day
       
    86 
       
    87 minimize miles:
       
    88        sum {(c1,t1,c2,t2) in schedule} distance[c1,c2] * X[c1,t1,c2,t2];
       
    89 
       
    90                         # Total car-miles run by all scheduled trains in a day
       
    91 
       
    92 ###  CONSTRAINTS  ###
       
    93 
       
    94 account {c in cities, t in times}:
       
    95 
       
    96   U[c,t] = U[c, if t > 1 then t-1 else last] +
       
    97 
       
    98       sum {(c1,t1,c,t) in schedule} X[c1,t1,c,t] -
       
    99       sum {(c,t,c2,t2) in schedule} X[c,t,c2,t2];
       
   100 
       
   101                         # For every city and time:
       
   102                         # unused cars in the present interval must equal
       
   103                         # unused cars in the previous interval,
       
   104                         # plus cars just arriving in trains,
       
   105                         # minus cars just leaving in trains
       
   106 
       
   107 satisfy {(c1,t1,c2,t2) in schedule}:
       
   108 
       
   109        low[c1,t1,c2,t2] <= X[c1,t1,c2,t2] <= high[c1,t1,c2,t2];
       
   110 
       
   111                         # For each scheduled train:
       
   112                         # number of cars must meet demand,
       
   113                         # but must not be so great that unnecessary
       
   114                         # sections are run
       
   115 
       
   116 ###  DATA  ###
       
   117 
       
   118 data;
       
   119 
       
   120 set cities := BO NY PH WA ;
       
   121 
       
   122 set links := (BO,NY) (NY,PH) (PH,WA)
       
   123              (NY,BO) (PH,NY) (WA,PH) ;
       
   124 
       
   125 param dist_table := [*,*]  BO NY  232
       
   126                            NY PH   90
       
   127                            PH WA  135 ;
       
   128 
       
   129 param last := 48 ;
       
   130 
       
   131 param section := 14 ;
       
   132 
       
   133 set schedule :=
       
   134 
       
   135    (WA,*,PH,*)   2  5     6  9     8 11    10 13
       
   136                 12 15    13 16    14 17    15 18
       
   137                 16 19    17 20    18 21    19 22
       
   138                 20 23    21 24    22 25    23 26
       
   139                 24 27    25 28    26 29    27 30
       
   140                 28 31    29 32    30 33    31 34
       
   141                 32 35    33 36    34 37    35 38
       
   142                 36 39    37 40    38 41    39 42
       
   143                 40 43    41 44    42 45    44 47
       
   144                 46  1
       
   145 
       
   146    (PH,*,NY,*)   1  3     5  7     9 11    11 13
       
   147                 13 15    14 16    15 17    16 18
       
   148                 17 19    18 20    19 21    20 22
       
   149                 21 23    22 24    23 25    24 26
       
   150                 25 27    26 28    27 29    28 30
       
   151                 29 31    30 32    31 33    32 34
       
   152                 33 35    34 36    35 37    36 38
       
   153                 37 39    38 40    39 41    40 42
       
   154                 41 43    42 44    43 45    44 46
       
   155                 45 47    47  1
       
   156 
       
   157    (NY,*,BO,*)  10 16    12 18    14 20    15 21
       
   158                 16 22    17 23    18 24    19 25
       
   159                 20 26    21 27    22 28    23 29
       
   160                 24 30    25 31    26 32    27 33
       
   161                 28 34    29 35    30 36    31 37
       
   162                 32 38    33 39    34 40    35 41
       
   163                 36 42    37 43    38 44    39 45
       
   164                 40 46    41 47    42 48    43  1
       
   165                 44  2    45  3    46  4    48  6
       
   166 
       
   167    (BO,*,NY,*)   7 13     9 15    11 17    12 18
       
   168                 13 19    14 20    15 21    16 22
       
   169                 17 23    18 24    19 25    20 26
       
   170                 21 27    22 28    23 29    24 30
       
   171                 25 31    26 32    27 33    28 34
       
   172                 29 35    30 36    31 37    32 38
       
   173                 33 39    34 40    35 41    36 42
       
   174                 37 43    38 44    39 45    40 46
       
   175                 41 47    43  1    45  3    47  5
       
   176 
       
   177    (NY,*,PH,*)   1  3    12 14    13 15    14 16
       
   178                 15 17    16 18    17 19    18 20
       
   179                 19 21    20 22    21 23    22 24
       
   180                 23 25    24 26    25 27    26 28
       
   181                 27 29    28 30    29 31    30 32
       
   182                 31 33    32 34    33 35    34 36
       
   183                 35 37    36 38    37 39    38 40
       
   184                 39 41    40 42    41 43    42 44
       
   185                 43 45    44 46    45 47    46 48
       
   186                 47  1
       
   187 
       
   188    (PH,*,WA,*)   1  4    14 17    15 18    16 19
       
   189                 17 20    18 21    19 22    20 23
       
   190                 21 24    22 25    23 26    24 27
       
   191                 25 28    26 29    27 30    28 31
       
   192                 29 32    30 33    31 34    32 35
       
   193                 33 36    34 37    35 38    36 39
       
   194                 37 40    38 41    39 42    40 43
       
   195                 41 44    42 45    43 46    44 47
       
   196                 45 48    46  1    47  2    ;
       
   197 
       
   198 param demand :=
       
   199 
       
   200  [WA,*,PH,*]   2  5    .55      6  9    .01      8 11    .01
       
   201               10 13    .13     12 15   1.59     13 16   1.69
       
   202               14 17   5.19     15 18   3.55     16 19   6.29
       
   203               17 20   4.00     18 21   5.80     19 22   3.40
       
   204               20 23   4.88     21 24   2.92     22 25   4.37
       
   205               23 26   2.80     24 27   4.23     25 28   2.88
       
   206               26 29   4.33     27 30   3.11     28 31   4.64
       
   207               29 32   3.44     30 33   4.95     31 34   3.73
       
   208               32 35   5.27     33 36   3.77     34 37   4.80
       
   209               35 38   3.31     36 39   3.89     37 40   2.65
       
   210               38 41   3.01     39 42   2.04     40 43   2.31
       
   211               41 44   1.52     42 45   1.75     44 47   1.88
       
   212               46  1   1.05
       
   213 
       
   214  [PH,*,NY,*]   1  3   1.05      5  7    .43      9 11    .20
       
   215               11 13    .21     13 15    .40     14 16   6.49
       
   216               15 17  16.40     16 18   9.48     17 19  17.15
       
   217               18 20   9.31     19 21  15.20     20 22   8.21
       
   218               21 23  13.32     22 24   7.35     23 25  11.83
       
   219               24 26   6.61     25 27  10.61     26 28   6.05
       
   220               27 29   9.65     28 30   5.61     29 31   9.25
       
   221               30 32   5.40     31 33   8.24     32 34   4.84
       
   222               33 35   7.44     34 36   4.44     35 37   6.80
       
   223               36 38   4.11     37 39   6.25     38 40   3.69
       
   224               39 41   5.55     40 42   3.29     41 43   4.77
       
   225               42 44   2.91     43 45   4.19     44 46   2.53
       
   226               45 47   4.00     47 1    1.65
       
   227 
       
   228  [NY,*,BO,*]  10 16   1.23     12 18   3.84     14 20   4.08
       
   229               15 21   1.47     16 22   2.96     17 23   1.60
       
   230               18 24   2.95     19 25   1.71     20 26   2.81
       
   231               21 27   1.77     22 28   2.87     23 29   1.84
       
   232               24 30   2.95     25 31   1.91     26 32   3.12
       
   233               27 33   1.93     28 34   3.31     29 35   2.00
       
   234               30 36   3.40     31 37   2.08     32 38   3.41
       
   235               33 39   2.69     34 40   4.45     35 41   2.32
       
   236               36 42   3.40     37 43   1.80     38 44   2.63
       
   237               39 45   1.52     40 46   2.23     41 47   1.25
       
   238               42 48   1.79     43  1    .97     44  2   1.28
       
   239               45  3    .48     46  4    .68     48  6    .08
       
   240 
       
   241  [BO,*,NY,*]   7 13    .03      9 15   1.29     11 17   4.59
       
   242               12 18   2.56     13 19   3.92     14 20   2.37
       
   243               15 21   3.81     16 22   2.24     17 23   3.51
       
   244               18 24   2.13     19 25   3.28     20 26   2.05
       
   245               21 27   3.15     22 28   1.99     23 29   3.09
       
   246               24 30   1.93     25 31   3.19     26 32   1.91
       
   247               27 33   3.21     28 34   1.85     29 35   3.21
       
   248               30 36   1.71     31 37   3.04     32 38   2.08
       
   249               33 39   3.13     34 40   1.96     35 41   2.53
       
   250               36 42   1.43     37 43   2.04     38 44   1.12
       
   251               39 45   1.71     40 46    .91     41 47   1.32
       
   252               43  1   1.80     45  3   1.13     47  5    .23
       
   253 
       
   254  [NY,*,PH,*]   1  3    .04     12 14   4.68     13 15   5.61
       
   255               14 16   3.56     15 17   5.81     16 18   3.81
       
   256               17 19   6.31     18 20   4.07     19 21   7.33
       
   257               20 22   4.55     21 23   7.37     22 24   4.73
       
   258               23 25   7.61     24 26   4.92     25 27   7.91
       
   259               26 28   5.19     27 29   8.40     28 30   5.53
       
   260               29 31   9.32     30 32   5.51     31 33  10.33
       
   261               32 34   9.21     33 35  18.95     34 36  11.23
       
   262               35 37  16.85     36 38   7.29     37 39  10.89
       
   263               38 40   5.41     39 41   8.21     40 42   4.52
       
   264               41 43   6.99     42 44   3.92     43 45   6.21
       
   265               44 46   3.44     45 47   5.17     46 48   2.55
       
   266               47  1   1.24
       
   267 
       
   268  [PH,*,WA,*]   1  4    .20     14 17   4.49     15 18   3.53
       
   269               16 19   2.67     17 20   3.83     18 21   3.01
       
   270               19 22   4.12     20 23   3.15     21 24   4.67
       
   271               22 25   3.20     23 26   4.23     24 27   2.87
       
   272               25 28   3.84     26 29   2.60     27 30   3.80
       
   273               28 31   2.77     29 32   4.31     30 33   3.16
       
   274               31 34   4.88     32 35   3.45     33 36   5.55
       
   275               34 37   3.52     35 38   6.11     36 39   3.32
       
   276               37 40   5.53     38 41   3.03     39 42   4.51
       
   277               40 43   2.53     41 44   3.39     42 45   1.93
       
   278               43 46   2.52     44 47   1.20     45 48   1.75
       
   279               46  1    .88     47  2    .87     ;
       
   280 
       
   281 end;