COIN-OR::LEMON - Graph Library

source: lemon-project-template-glpk/deps/glpk/examples/prod.mod

subpack-glpk
Last change on this file was 9:33de93886c88, checked in by Alpar Juttner <alpar@…>, 13 years ago

Import GLPK 4.47

File size: 10.4 KB
Line 
1# PROD, a multiperiod production model
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###  PRODUCTION SETS AND PARAMETERS  ###
8
9set prd 'products';    # Members of the product group
10
11param pt 'production time' {prd} > 0;
12
13                        # Crew-hours to produce 1000 units
14
15param pc 'production cost' {prd} > 0;
16
17                        # Nominal production cost per 1000, used
18                        # to compute inventory and shortage costs
19
20###  TIME PERIOD SETS AND PARAMETERS  ###
21
22param first > 0 integer;
23                        # Index of first production period to be modeled
24
25param last > first integer;
26
27                        # Index of last production period to be modeled
28
29set time 'planning horizon' := first..last;
30
31###  EMPLOYMENT PARAMETERS  ###
32
33param cs 'crew size' > 0 integer;
34
35                        # Workers per crew
36
37param sl 'shift length' > 0;
38
39                        # Regular-time hours per shift
40
41param rtr 'regular time rate' > 0;
42
43                        # Wage per hour for regular-time labor
44
45param otr 'overtime rate' > rtr;
46
47                        # Wage per hour for overtime labor
48
49param iw 'initial workforce' >= 0 integer;
50
51                        # Crews employed at start of first period
52
53param dpp 'days per period' {time} > 0;
54
55                        # Regular working days in a production period
56
57param ol 'overtime limit' {time} >= 0;
58
59                        # Maximum crew-hours of overtime in a period
60
61param cmin 'crew minimum' {time} >= 0;
62
63                        # Lower limit on average employment in a period
64
65param cmax 'crew maximum' {t in time} >= cmin[t];
66
67                        # Upper limit on average employment in a period
68
69param hc 'hiring cost' {time} >= 0;
70
71                        # Penalty cost of hiring a crew
72
73param lc 'layoff cost' {time} >= 0;
74
75                        # Penalty cost of laying off a crew
76
77###  DEMAND PARAMETERS  ###
78
79param dem 'demand' {prd,first..last+1} >= 0;
80
81                        # Requirements (in 1000s)
82                        # to be met from current production and inventory
83
84param pro 'promoted' {prd,first..last+1} logical;
85
86                        # true if product will be the subject
87                        # of a special promotion in the period
88
89###  INVENTORY AND SHORTAGE PARAMETERS  ###
90
91param rir 'regular inventory ratio' >= 0;
92
93                        # Proportion of non-promoted demand
94                        # that must be in inventory the previous period
95
96param pir 'promotional inventory ratio' >= 0;
97
98                        # Proportion of promoted demand
99                        # that must be in inventory the previous period
100
101param life 'inventory lifetime' > 0 integer;
102
103                        # Upper limit on number of periods that
104                        # any product may sit in inventory
105
106param cri 'inventory cost ratio' {prd} > 0;
107
108                        # Inventory cost per 1000 units is
109                        # cri times nominal production cost
110
111param crs 'shortage cost ratio' {prd} > 0;
112
113                        # Shortage cost per 1000 units is
114                        # crs times nominal production cost
115
116param iinv 'initial inventory' {prd} >= 0;
117
118                        # Inventory at start of first period; age unknown
119
120param iil 'initial inventory left' {p in prd, t in time}
121              := iinv[p] less sum {v in first..t} dem[p,v];
122
123                        # Initial inventory still available for allocation
124                        # at end of period t
125
126param minv 'minimum inventory' {p in prd, t in time}
127              := dem[p,t+1] * (if pro[p,t+1] then pir else rir);
128
129                        # Lower limit on inventory at end of period t
130
131###  VARIABLES  ###
132
133var Crews{first-1..last} >= 0;
134
135                        # Average number of crews employed in each period
136
137var Hire{time} >= 0;    # Crews hired from previous to current period
138
139var Layoff{time} >= 0;  # Crews laid off from previous to current period
140
141var Rprd 'regular production' {prd,time} >= 0;
142
143                        # Production using regular-time labor, in 1000s
144
145var Oprd 'overtime production' {prd,time} >= 0;
146
147                        # Production using overtime labor, in 1000s
148
149var Inv 'inventory' {prd,time,1..life} >= 0;
150
151                        # Inv[p,t,a] is the amount of product p that is
152                        # a periods old -- produced in period (t+1)-a --
153                        # and still in storage at the end of period t
154
155var Short 'shortage' {prd,time} >= 0;
156
157                        # Accumulated unsatisfied demand at the end of period t
158
159###  OBJECTIVE  ###
160
161minimize cost:
162
163    sum {t in time} rtr * sl * dpp[t] * cs * Crews[t] +
164    sum {t in time} hc[t] * Hire[t] +
165    sum {t in time} lc[t] * Layoff[t] +
166    sum {t in time, p in prd} otr * cs * pt[p] * Oprd[p,t] +
167    sum {t in time, p in prd, a in 1..life} cri[p] * pc[p] * Inv[p,t,a] +
168    sum {t in time, p in prd} crs[p] * pc[p] * Short[p,t];
169
170                        # Full regular wages for all crews employed, plus
171                        # penalties for hiring and layoffs, plus
172                        # wages for any overtime worked, plus
173                        # inventory and shortage costs
174
175                        # (All other production costs are assumed
176                        # to depend on initial inventory and on demands,
177                        # and so are not included explicitly.)
178
179###  CONSTRAINTS  ###
180
181rlim 'regular-time limit' {t in time}:
182
183    sum {p in prd} pt[p] * Rprd[p,t] <= sl * dpp[t] * Crews[t];
184
185                        # Hours needed to accomplish all regular-time
186                        # production in a period must not exceed
187                        # hours available on all shifts
188
189olim 'overtime limit' {t in time}:
190
191    sum {p in prd} pt[p] * Oprd[p,t] <= ol[t];
192
193                        # Hours needed to accomplish all overtime
194                        # production in a period must not exceed
195                        # the specified overtime limit
196
197empl0 'initial crew level':  Crews[first-1] = iw;
198
199                        # Use given initial workforce
200
201empl 'crew levels' {t in time}:  Crews[t] = Crews[t-1] + Hire[t] - Layoff[t];
202
203                        # Workforce changes by hiring or layoffs
204
205emplbnd 'crew limits' {t in time}:  cmin[t] <= Crews[t] <= cmax[t];
206
207                        # Workforce must remain within specified bounds
208
209dreq1 'first demand requirement' {p in prd}:
210
211    Rprd[p,first] + Oprd[p,first] + Short[p,first]
212                             - Inv[p,first,1] = dem[p,first] less iinv[p];
213
214dreq 'demand requirements' {p in prd, t in first+1..last}:
215
216    Rprd[p,t] + Oprd[p,t] + Short[p,t] - Short[p,t-1]
217                          + sum {a in 1..life} (Inv[p,t-1,a] - Inv[p,t,a])
218                                                  = dem[p,t] less iil[p,t-1];
219
220                        # Production plus increase in shortage plus
221                        # decrease in inventory must equal demand
222
223ireq 'inventory requirements' {p in prd, t in time}:
224
225    sum {a in 1..life} Inv[p,t,a] + iil[p,t] >= minv[p,t];
226
227                        # Inventory in storage at end of period t
228                        # must meet specified minimum
229
230izero 'impossible inventories' {p in prd, v in 1..life-1, a in v+1..life}:
231
232    Inv[p,first+v-1,a] = 0;
233
234                        # In the vth period (starting from first)
235                        # no inventory may be more than v periods old
236                        # (initial inventories are handled separately)
237
238ilim1 'new-inventory limits' {p in prd, t in time}:
239
240    Inv[p,t,1] <= Rprd[p,t] + Oprd[p,t];
241
242                        # New inventory cannot exceed
243                        # production in the most recent period
244
245ilim 'inventory limits' {p in prd, t in first+1..last, a in 2..life}:
246
247    Inv[p,t,a] <= Inv[p,t-1,a-1];
248
249                        # Inventory left from period (t+1)-p
250                        # can only decrease as time goes on
251
252###  DATA  ###
253
254data;
255
256set prd := 18REG 24REG 24PRO ;
257
258param first :=  1 ;
259param last  := 13 ;
260param life  :=  2 ;
261
262param cs := 18 ;
263param sl :=  8 ;
264param iw :=  8 ;
265
266param rtr := 16.00 ;
267param otr := 43.85 ;
268param rir :=  0.75 ;
269param pir :=  0.80 ;
270
271param :         pt       pc        cri       crs      iinv   :=
272
273  18REG      1.194     2304.     0.015     1.100      82.0
274  24REG      1.509     2920.     0.015     1.100     792.2
275  24PRO      1.509     2910.     0.015     1.100       0.0   ;
276
277param :     dpp        ol      cmin      cmax        hc        lc   :=
278
279  1        19.5      96.0       0.0       8.0      7500      7500
280  2        19.0      96.0       0.0       8.0      7500      7500
281  3        20.0      96.0       0.0       8.0      7500      7500
282  4        19.0      96.0       0.0       8.0      7500      7500
283  5        19.5      96.0       0.0       8.0     15000     15000
284  6        19.0      96.0       0.0       8.0     15000     15000
285  7        19.0      96.0       0.0       8.0     15000     15000
286  8        20.0      96.0       0.0       8.0     15000     15000
287  9        19.0      96.0       0.0       8.0     15000     15000
288 10        20.0      96.0       0.0       8.0     15000     15000
289 11        20.0      96.0       0.0       8.0      7500      7500
290 12        18.0      96.0       0.0       8.0      7500      7500
291 13        18.0      96.0       0.0       8.0      7500      7500   ;
292
293param dem (tr) :
294
295          18REG     24REG     24PRO   :=
296
297  1        63.8    1212.0       0.0
298  2        76.0     306.2       0.0
299  3        88.4     319.0       0.0
300  4       913.8     208.4       0.0
301  5       115.0     298.0       0.0
302  6       133.8     328.2       0.0
303  7        79.6     959.6       0.0
304  8       111.0     257.6       0.0
305  9       121.6     335.6       0.0
306 10       470.0     118.0    1102.0
307 11        78.4     284.8       0.0
308 12        99.4     970.0       0.0
309 13       140.4     343.8       0.0
310 14        63.8    1212.0       0.0   ;
311
312param pro (tr) :
313
314          18REG     24REG     24PRO   :=
315
316  1           0         1         0
317  2           0         0         0
318  3           0         0         0
319  4           1         0         0
320  5           0         0         0
321  6           0         0         0
322  7           0         1         0
323  8           0         0         0
324  9           0         0         0
325 10           1         0         1
326 11           0         0         0
327 12           0         0         0
328 13           0         1         0
329 14           0         1         0   ;
330
331end;
Note: See TracBrowser for help on using the repository browser.