1 # DIST, a product distribution model
4 # Robert Fourer, David M. Gay and Brian W. Kernighan, "A Modeling Language
5 # for Mathematical Programming." Management Science 36 (1990) 519-554.
7 ### SHIPPING SETS AND PARAMETERS ###
9 set whse 'warehouses'; # Locations from which demand is satisfied
11 set dctr 'distribution centers' within whse;
13 # Locations from which product may be shipped
15 param sc 'shipping cost' {dctr,whse} >= 0;
17 # Shipping costs, to whse from dctr, in $ / 100 lb
19 param huge 'largest shipping cost' > 0;
21 # Largest cost allowed for a usable shipping route
23 param msr 'minimum size restriction' {dctr,whse} logical;
25 # True indicates a minimum-size restriction on
26 # direct shipments using this dctr --> whse route
28 param dsr 'direct shipment requirement' {dctr} >= 0;
30 # Minimum total demand, in pallets, needed to
31 # allow shipment on routes subject to the
32 # minimum size restriction
34 ### PLANT SETS AND PARAMETERS ###
36 set fact 'factories' within dctr;
38 # Locations where product is manufactured
40 param rtmin 'regular-time total minimum' >= 0;
42 # Lower limit on (average) total regular-time
43 # crews employed at all factories
45 param rtmax 'regular-time total maximum' >= rtmin;
47 # Upper limit on (average) total regular-time
48 # crews employed at all factories
50 param otmin 'overtime total minimum' >= 0;
52 # Lower limit on total overtime hours at all factories
54 param otmax 'overtime total maximum' >= otmin;
56 # Upper limit on total overtime hours at all factories
58 param rmin 'regular-time minimums' {fact} >= 0;
60 # Lower limits on (average) regular-time crews
62 param rmax 'regular-time maximums' {f in fact} >= rmin[f];
64 # Upper limits on (average) regular-time crews
66 param omin 'overtime minimums' {fact} >= 0;
68 # Lower limits on overtime hours
70 param omax 'overtime maximums' {f in fact} >= omin[f];
72 # Upper limits on overtime hours
74 param hd 'hours per day' {fact} >= 0;
76 # Regular-time hours per working day
78 param dp 'days in period' {fact} > 0;
80 # Working days in the current planning period
82 ### PRODUCT SETS AND PARAMETERS ###
84 set prd 'products'; # Elements of the product group
86 param wt 'weight' {prd} > 0;
88 # Weight in 100 lb / 1000 cases
90 param cpp 'cases per pallet' {prd} > 0;
92 # Cases of product per shipping pallet
94 param tc 'transshipment cost' {prd} >= 0;
96 # Transshipment cost in $ / 1000 cases
98 param pt 'production time' {prd,fact} >= 0;
100 # Crew-hours to produce 1000 cases
102 param rpc 'regular-time production cost' {prd,fact} >= 0;
104 # Cost of production on regular time,
107 param opc 'overtime production cost' {prd,fact} >= 0;
109 # Cost of production on overtime, in $ / 1000 cases
111 ### DEMAND SETS AND PARAMETERS ###
113 param dt 'total demand' {prd} >= 0;
115 # Total demands for products, in 1000s
117 param ds 'demand shares' {prd,whse} >= 0.0, <= 1.0;
119 # Historical demand data, from which each
120 # warehouse's share of total demand is deduced
122 param dstot {p in prd} := sum {w in whse} ds[p,w];
124 # Total of demand shares; should be 1, but often isn't
126 param dem 'demand' {p in prd, w in whse} := dt[p] * ds[p,w] / dstot[p];
128 # Projected demands to be satisfied, in 1000s
130 set rt 'shipping routes available' :=
132 {d in dctr, w in whse:
133 d <> w and sc[d,w] < huge and
134 (w in dctr or sum {p in prd} dem[p,w] > 0) and
135 not (msr[d,w] and sum {p in prd} 1000*dem[p,w]/cpp[p] < dsr[d]) };
137 # List of ordered pairs that represent routes
138 # on which shipments are allowed
142 var Rprd 'regular-time production' {prd,fact} >= 0;
144 # Regular-time production of each product
145 # at each factory, in 1000s of cases
147 var Oprd 'overtime production' {prd,fact} >= 0;
149 # Overtime production of each product
150 # at each factory, in 1000s of cases
152 var Ship 'shipments' {prd,rt} >= 0;
154 # Shipments of each product on each allowed route,
157 var Trans 'transshipments' {prd,dctr} >= 0;
159 # Transshipments of each product at each
160 # distribution center, in 1000s of cases
164 minimize cost: sum {p in prd, f in fact} rpc[p,f] * Rprd[p,f] +
165 sum {p in prd, f in fact} opc[p,f] * Oprd[p,f] +
166 sum {p in prd, (d,w) in rt} sc[d,w] * wt[p] * Ship[p,d,w] +
167 sum {p in prd, d in dctr} tc[p] * Trans[p,d];
169 # Total cost: regular production, overtime
170 # production, shipping, and transshipment
174 rtlim 'regular-time total limits':
176 rtmin <= sum {p in prd, f in fact}
177 (pt[p,f] * Rprd[p,f]) / (dp[f] * hd[f]) <= rtmax;
179 # Total crews must lie between limits
181 otlim 'overtime total limits':
183 otmin <= sum {p in prd, f in fact} pt[p,f] * Oprd[p,f] <= otmax;
185 # Total overtime must lie between limits
187 rlim 'regular-time limits' {f in fact}:
189 rmin[f] <= sum {p in prd}
190 (pt[p,f] * Rprd[p,f]) / (dp[f] * hd[f]) <= rmax[f];
192 # Crews at each factory must lie between limits
194 olim 'overtime limits' {f in fact}:
196 omin[f] <= sum {p in prd} pt[p,f] * Oprd[p,f] <= omax[f];
198 # Overtime at each factory must lie between limits
200 noRprd 'no regular production' {p in prd, f in fact: rpc[p,f] = 0}:
204 noOprd 'no overtime production' {p in prd, f in fact: opc[p,f] = 0}:
206 Oprd[p,f] = 0; # Do not produce where specified cost is zero
208 bal 'material balance' {p in prd, w in whse}:
211 Ship [p,v,w] + (if w in fact then Rprd[p,w] + Oprd[p,w]) =
213 dem[p,w] + (if w in dctr then sum {(w,v) in rt} Ship[p,w,v]);
215 # Demand is satisfied by shipment into warehouse
216 # plus production (if it is a factory)
217 # minus shipment out (if it is a distn. center)
219 trdef 'transshipment definition' {p in prd, d in dctr}:
221 Trans[p,d] >= sum {(d,w) in rt} Ship [p,d,w] -
222 (if d in fact then Rprd[p,d] + Oprd[p,d]);
224 # Transshipment at a distribution center is
225 # shipments out less production (if any)
227 ### DATA -- 3 PRODUCTS ###
231 set prd := 18REG 24REG 24PRO ;
233 set whse := w01 w02 w03 w04 w05 w06 w08 w09 w12 w14 w15 w17
234 w18 w19 w20 w21 w24 w25 w26 w27 w28 w29 w30 w31
235 w32 w33 w34 w35 w36 w37 w38 w39 w40 w41 w42 w43
236 w44 w45 w46 w47 w48 w49 w50 w51 w53 w54 w55 w56
237 w57 w59 w60 w61 w62 w63 w64 w65 w66 w68 w69 w71
238 w72 w73 w74 w75 w76 w77 w78 w79 w80 w81 w82 w83
239 w84 w85 w86 w87 w89 w90 w91 w92 w93 w94 w95 w96
242 set dctr := w01 w02 w03 w04 w05 w62 w76 w96 ;
244 set fact := w01 w05 w96 ;
252 param otmax := 96.0 ;
254 param rmin := w01 0.00 w05 0.00 w96 0.00 ;
255 param rmax := w01 3.00 w05 2.00 w96 3.00 ;
257 param omin := w01 0.0 w05 0.0 w96 0.0 ;
258 param omax := w01 48.0 w05 0.0 w96 48.0 ;
260 param hd := w01 8.0 w05 8.0 w96 8.0 ;
262 param dp := w01 19.0 w05 19.0 w96 19.0 ;
264 param wt := 18REG 47.3 24REG 63.0 24PRO 63.0 ;
266 param tc := 18REG 40.00 24REG 45.00 24PRO 45.00 ;
268 param dt := 18REG 376.0 24REG 172.4 24PRO 316.3 ;
270 param cpp := 18REG 102. 24REG 91. 24PRO 91. ;
272 param dsr := w01 96. w02 96. w03 96. w04 96. w05 96.
273 w62 96. w76 96. w96 96. ;
279 w01 1.194 1.429 1.429
280 w05 1.194 1.509 1.509
281 w96 0.000 1.600 1.600 ;
287 w01 2119. 2653. 2617.
288 w05 2489. 3182. 3176.
295 w01 2903. 3585. 3579.
299 param sc default 99.99 (tr) :
301 w01 w02 w03 w04 w05 w62 w76 w96 :=
303 w01 . 2.97 1.14 2.08 2.37 1.26 2.42 1.43
304 w02 4.74 . 4.17 6.12 7.41 3.78 7.04 5.21
305 w03 2.45 4.74 . 3.67 2.84 0.90 2.41 2.55
306 w04 1.74 5.03 2.43 . 3.19 2.45 2.69 0.58
307 w05 2.70 5.16 2.84 2.85 . 3.26 3.34 2.71
308 w06 1.99 4.17 2.13 2.19 2.52 2.06 2.00 1.51
309 w08 0.21 2.92 1.24 2.07 2.29 1.25 2.32 1.55
310 w09 0.66 3.76 1.41 2.47 1.82 1.66 . 1.87
311 w12 1.38 3.83 1.68 2.53 2.39 . 1.96 1.94
312 w14 2.47 1.58 2.40 3.59 3.85 2.25 . 3.05
313 w15 1.06 4.95 2.48 1.39 3.41 1.96 . 1.02
314 w17 0.88 3.39 1.46 2.00 2.67 1.45 . 1.46
315 w18 7.90 6.57 7.79 9.59 10.81 . . 6.70
316 w19 1.42 4.12 1.96 1.99 3.52 1.88 . 1.26
317 w20 3.03 1.59 2.34 4.76 3.98 1.88 . 3.73
318 w24 1.58 2.80 2.27 2.87 3.19 1.31 . 2.05
319 w25 1.51 5.05 2.74 0.57 2.98 . 2.95 0.27
320 w26 1.75 3.61 2.70 1.54 4.07 3.52 . 1.03
321 w27 2.48 6.87 3.17 1.59 2.08 3.45 . 0.99
322 w28 2.05 6.83 2.97 1.13 2.91 . . 1.26
323 w29 4.03 3.68 4.46 3.20 5.50 . . 3.20
324 w30 2.48 5.78 2.99 2.24 1.79 3.10 . 1.39
325 w31 2.34 5.41 2.87 1.67 1.66 . . 1.39
326 w32 14.36 . . . . . . .
327 w33 3.87 4.27 5.11 3.48 5.66 4.03 . 3.05
328 w34 3.26 4.80 3.21 2.70 4.14 . . 1.77
329 w35 2.34 2.84 2.89 3.35 3.78 2.68 . 2.52
330 w36 2.43 5.69 2.96 2.95 1.02 2.61 1.07 2.54
331 w37 2.23 4.64 2.41 1.99 4.30 2.61 . 1.44
332 w38 4.66 4.36 5.23 3.04 4.46 . . 3.82
333 w39 1.11 3.51 1.10 2.53 3.07 1.12 . 2.23
334 w40 2.99 4.78 4.23 1.57 3.92 . . 1.80
335 w41 4.93 4.00 5.43 4.45 6.31 . . 3.81
336 w42 3.86 6.55 5.03 2.11 4.41 . . 2.63
337 w43 4.61 4.45 3.77 1.22 4.31 . . 2.35
338 w44 2.05 4.48 1.06 3.70 3.46 1.10 . 3.21
339 w45 0.92 3.42 1.58 3.04 1.82 1.94 . 2.52
340 w46 1.36 2.44 0.95 3.08 2.78 0.39 2.16 2.37
341 w47 1.30 3.39 1.60 2.49 4.29 2.04 . 1.68
342 w48 1.65 3.78 1.03 2.97 2.21 1.31 . 2.74
343 w49 1.96 3.00 1.50 3.24 3.68 1.00 . 2.99
344 w50 0.90 4.14 1.60 1.95 3.61 1.61 . 1.52
345 w51 1.59 3.95 0.25 2.96 2.58 1.00 2.41 2.71
346 w53 1.59 3.79 1.28 3.12 3.10 0.89 . 2.98
347 w54 1.72 4.36 1.61 2.92 2.34 1.91 1.97 3.05
348 w55 2.45 2.73 2.21 4.47 4.30 2.57 . 4.48
349 w56 1.10 3.73 1.59 2.74 2.33 1.45 . 2.44
350 w57 0.95 3.39 1.37 2.30 2.47 1.15 . 1.95
351 w59 3.29 5.35 3.32 3.81 1.52 3.38 1.34 4.08
352 w60 2.41 6.12 2.46 3.65 2.35 . 1.37 4.06
353 w61 3.32 5.50 3.41 3.38 1.23 . 0.99 4.28
354 w62 1.12 3.00 0.82 3.22 2.95 . 3.33 2.53
355 w63 3.59 6.36 3.25 4.12 1.84 3.59 1.46 4.03
356 w64 1.85 4.45 2.17 3.43 2.13 2.03 . 4.02
357 w65 2.78 4.79 2.81 2.94 1.54 2.90 1.07 2.94
358 w66 3.90 5.79 3.05 3.65 1.36 3.39 1.22 3.57
359 w68 2.61 5.20 2.90 2.34 1.68 3.19 1.48 2.31
360 w69 2.94 5.21 2.78 3.43 0.21 3.26 0.68 2.54
361 w71 2.06 4.98 2.38 2.44 1.59 2.97 1.05 2.55
362 w72 2.61 5.50 2.83 3.12 1.35 3.23 0.88 2.99
363 w73 8.52 6.16 8.03 8.83 10.44 7.38 10.26 .
364 w74 6.11 5.46 9.07 9.38 10.80 . . 8.25
365 w75 2.66 4.94 2.87 3.69 1.52 3.15 1.24 4.00
366 w76 1.99 5.26 2.23 3.36 0.58 3.17 . 2.50
367 w77 4.32 3.07 5.05 3.88 6.04 . . 4.15
368 w78 5.60 2.59 5.78 5.56 7.10 . . 5.60
369 w79 4.25 2.32 4.93 4.57 6.04 . . 4.58
370 w80 5.94 4.00 5.60 7.02 9.46 . . 7.51
371 w81 5.39 2.21 5.10 6.22 6.46 . . 6.58
372 w82 8.80 5.69 9.29 9.88 11.69 8.63 11.52 .
373 w83 4.40 . 5.24 5.21 5.81 3.91 7.04 5.33
374 w84 5.87 5.43 6.17 5.70 7.63 . . 5.70
375 w85 3.90 3.65 3.38 4.57 5.64 3.05 . 5.04
376 w86 5.48 2.10 5.70 6.37 7.33 . . 6.19
377 w87 8.88 5.54 9.50 9.71 11.64 8.85 11.68 .
378 w89 4.62 4.01 4.03 6.30 6.30 3.81 . 7.77
379 w90 4.35 2.72 4.61 4.01 5.60 . . 3.20
380 w91 7.61 4.42 7.83 6.85 8.79 . . 7.66
381 w92 7.15 2.69 6.91 7.20 . . . 7.06
382 w93 3.17 3.95 4.37 3.74 5.05 . . 2.40
383 w94 1.21 3.07 0.90 2.74 3.17 . 2.63 2.39
384 w95 5.82 3.29 6.55 7.06 11.47 . . 7.83
385 w96 1.77 5.20 2.72 0.59 3.47 2.48 . .
386 w98 3.04 1.92 3.64 3.70 4.90 3.05 . 3.88
387 x22 4.08 6.25 4.15 4.30 1.77 . 1.77 .
388 x23 3.39 5.74 3.55 4.08 1.69 . 1.47 . ;
392 w01 w02 w03 w04 w05 w62 w76 w96 :=
479 x23 1 1 1 1 0 0 1 0 ;
481 param ds default 0.000 (tr) :
485 w01 0.000 0.000 0.008
486 w02 0.004 0.000 0.000
487 w03 0.000 0.000 0.000
488 w04 0.010 0.002 0.000
489 w05 0.000 0.000 0.000
490 w06 0.010 0.008 0.008
491 w08 0.030 0.024 0.024
492 w09 0.014 0.018 0.020
493 w12 0.014 0.012 0.010
494 w14 0.007 0.007 0.012
495 w15 0.010 0.019 0.018
496 w17 0.013 0.010 0.011
497 w19 0.015 0.012 0.009
498 w20 0.012 0.021 0.022
499 w21 0.000 0.000 0.000
500 w24 0.012 0.022 0.018
501 w25 0.019 0.025 0.020
502 w26 0.006 0.015 0.021
503 w27 0.008 0.010 0.015
504 w28 0.011 0.016 0.019
505 w29 0.008 0.020 0.013
506 w30 0.011 0.013 0.015
507 w31 0.011 0.013 0.017
508 w32 0.006 0.000 0.000
509 w33 0.000 0.015 0.014
510 w34 0.008 0.007 0.005
511 w35 0.002 0.006 0.014
512 w36 0.015 0.013 0.005
513 w37 0.017 0.016 0.015
514 w38 0.015 0.009 0.012
515 w39 0.007 0.017 0.022
516 w40 0.009 0.014 0.020
517 w41 0.003 0.014 0.011
518 w42 0.017 0.011 0.012
519 w43 0.009 0.013 0.011
520 w44 0.002 0.012 0.012
521 w45 0.016 0.025 0.028
522 w46 0.038 0.062 0.040
523 w47 0.007 0.010 0.010
524 w48 0.003 0.015 0.016
525 w49 0.005 0.016 0.017
526 w50 0.011 0.008 0.007
527 w51 0.010 0.022 0.021
528 w53 0.004 0.026 0.020
529 w54 0.020 0.017 0.025
530 w55 0.004 0.019 0.028
531 w56 0.004 0.010 0.008
532 w57 0.014 0.020 0.018
533 w59 0.012 0.006 0.007
534 w60 0.019 0.010 0.009
535 w61 0.028 0.010 0.012
536 w62 0.000 0.000 0.000
537 w63 0.070 0.027 0.037
538 w64 0.009 0.004 0.005
539 w65 0.022 0.015 0.016
540 w66 0.046 0.017 0.020
541 w68 0.005 0.012 0.016
542 w69 0.085 0.036 0.039
543 w71 0.011 0.013 0.010
544 w72 0.089 0.031 0.034
545 w75 0.026 0.012 0.010
546 w77 0.001 0.004 0.002
547 w78 0.002 0.004 0.002
548 w79 0.001 0.004 0.002
549 w80 0.001 0.001 0.002
550 w81 0.001 0.003 0.002
551 w83 0.009 0.010 0.008
552 w84 0.001 0.002 0.002
553 w85 0.001 0.004 0.005
554 w86 0.001 0.002 0.002
555 w87 0.002 0.003 0.000
556 w89 0.001 0.001 0.002
557 w90 0.006 0.017 0.013
558 w91 0.002 0.010 0.013
559 w92 0.000 0.003 0.002
560 w93 0.002 0.006 0.007
561 w95 0.001 0.007 0.007
562 w96 0.000 0.000 0.000
563 w98 0.006 0.005 0.002 ;