examples/train.mod
author Alpar Juttner <alpar@cs.elte.hu>
Sun, 05 Dec 2010 17:35:23 +0100
changeset 2 4c8956a7bdf4
permissions -rw-r--r--
Set up CMAKE build environment
     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;