-
Notifications
You must be signed in to change notification settings - Fork 0
/
Project.gms
605 lines (582 loc) · 13.5 KB
/
Project.gms
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
$title Code for the combined optimization
$onText
$offText
Sets
i 'item' /1*260/
j 'person groups' /1*8/
k 'macronutrients' /1*6/;
Parameters
C(i) 'cost of item i'
/
1 2.50
2 2.50
3 2.50
4 3.00
5 3.00
6 3.25
7 2.75
8 3.00
9 3.25
10 3.50
11 2.75
12 3.00
13 3.25
14 3.50
15 2.75
16 3.00
17 3.25
18 3.50
19 2.75
20 2.75
21 2.75
22 2.75
23 2.75
24 2.75
25 2.75
26 2.75
27 2.75
28 2.75
29 2.75
30 2.75
31 2.75
32 2.75
33 2.75
34 2.75
35 2.75
36 4.00
37 4.50
38 3.15
39 0.75
40 1.25
41 1.75
42 2.00
43 3.50
44 2.75
45 3.00
46 3.00
47 3.25
48 3.25
49 2.75
50 3.00
51 3.50
52 3.75
53 3.25
54 3.50
55 2.75
56 2.75
57 2.75
58 2.75
59 3.00
60 3.00
61 3.25
62 3.25
63 2.75
64 2.75
65 3.00
66 3.00
67 3.25
68 3.25
69 2.75
70 3.00
71 3.00
72 3.25
73 3.25
74 2.75
75 2.75
76 2.75
77 2.75
78 3.00
79 2.00
80 2.25
81 2.50
82 5.00
83 10.00
84 2.75
85 2.75
86 3.00
87 3.00
88 2.75
89 3.00
90 3.00
91 2.45
92 2.45
93 2.45
94 2.45
95 2.45
96 2.45
97 1.50
98 1.90
99 2.10
100 1.25
101 2.00
102 1.50
103 2.45
104 3.00
105 2.25
106 2.25
107 1.45
108 2.00
109 2.00
110 2.00
111 1.75
112 2.00
113 2.15
114 1.25
115 1.75
116 2.00
117 2.15
118 1.25
119 1.75
120 2.00
121 2.15
122 1.25
123 1.75
124 2.00
125 2.15
126 1.25
127 1.75
128 2.00
129 2.15
130 1.25
131 1.25
132 1.25
133 1.25
134 1.25
135 1.75
136 2.00
137 1.00
138 1.75
139 2.00
140 2.15
141 1.25
142 1.75
143 2.00
144 2.15
145 1.25
146 1.75
147 2.00
148 2.15
149 1.75
150 2.00
151 2.15
152 1.75
153 2.00
154 2.15
155 1.75
156 2.00
157 2.15
158 1.75
159 2.00
160 2.15
161 1.75
162 2.00
163 2.15
164 1.75
165 2.00
166 2.15
167 1.75
168 2.00
169 2.15
170 1.75
171 2.00
172 2.15
173 1.75
174 2.00
175 2.15
176 1.75
177 2.00
178 2.15
179 1.75
180 2.00
181 2.15
182 1.75
183 2.00
184 2.15
185 1.75
186 2.00
187 2.15
188 1.75
189 2.00
190 2.15
191 1.75
192 2.00
193 2.15
194 1.75
195 2.00
196 2.15
197 1.75
198 2.00
199 2.15
200 1.75
201 2.00
202 2.15
203 1.75
204 2.00
205 2.15
206 1.75
207 2.00
208 2.15
209 1.75
210 2.00
211 2.15
212 1.75
213 2.00
214 2.15
215 1.75
216 2.00
217 2.15
218 1.75
219 2.00
220 2.15
221 1.75
222 2.00
223 2.15
224 1.75
225 2.00
226 2.15
227 1.75
228 2.00
229 2.15
230 1.75
231 2.00
232 2.15
233 1.75
234 2.00
235 2.15
236 1.75
237 2.00
238 2.15
239 1.75
240 2.00
241 2.15
242 1.75
243 2.00
244 2.15
245 1.75
246 2.00
247 2.15
248 1.75
249 2.00
250 2.15
251 3.00
252 3.15
254 3.00
255 2.40
256 2.80
257 3.00
258 2.40
259 2.25
260 1.85
253 2.80
/
;
Table n(i,k) 'nutritional value k (columns) for item i (rows) + cost (last colmn)'
1 2 3 4 5 6
1 300 750 31 4 17 13
2 250 770 30 4 18 8
3 370 780 29 4 14 23
4 450 860 30 4 21 28
5 400 880 30 4 21 23
6 430 960 31 4 26 23
7 460 1300 38 2 19 26
8 520 1410 43 3 19 30
9 410 1300 36 2 20 20
10 470 1420 42 3 20 25
11 430 1080 34 2 11 27
12 480 1190 39 3 11 31
13 510 1170 36 2 18 33
14 570 1280 42 3 18 37
15 460 1180 34 2 18 27
16 520 1290 40 3 18 32
17 410 1180 41 2 17 20
18 470 1290 46 3 17 24
19 540 1470 38 2 25 32
20 460 1250 48 2 19 21
21 400 1250 47 2 20 15
22 420 1030 44 2 11 22
23 550 1320 48 2 20 31
24 500 1320 46 2 21 26
25 620 1480 57 3 30 31
26 570 1480 55 3 30 25
27 670 1510 56 3 33 35
28 740 1560 51 3 28 48
29 800 1680 56 4 28 52
30 640 1590 50 3 26 37
31 690 1700 55 4 26 41
32 1090 2150 111 6 36 56
33 1150 2260 116 7 36 60
34 990 2170 110 6 35 46
35 1050 2290 115 7 35 50
36 350 590 60 3 8 9
37 520 930 61 3 15 24
38 300 790 26 1 12 16
39 150 310 15 2 1 9
40 460 370 66 3 6 19
41 290 160 58 5 5 4
42 260 115 49 5 5 4
43 530 960 47 3 24 27
44 520 1100 41 3 30 26
45 600 1440 48 3 37 29
46 610 1180 46 3 37 31
47 540 960 45 3 29 27
48 750 1280 42 3 48 43
49 240 480 32 1 12 8
50 290 680 33 2 15 11
51 430 1040 35 2 24 21
52 720 1470 51 4 39 40
53 380 840 34 2 22 17
54 440 1110 35 2 27 22
55 430 760 34 2 22 22
56 430 1030 35 2 22 23
57 500 980 44 3 22 26
58 510 990 55 3 24 22
59 350 820 42 3 28 9
60 670 1410 58 3 36 33
61 510 1250 44 3 40 20
62 610 1400 57 3 32 28
63 450 1230 43 3 36 15
64 750 1720 65 4 36 38
65 590 1560 51 4 40 25
66 430 910 43 2 21 19
67 360 800 40 2 14 16
68 480 1260 43 2 22 24
69 430 1260 41 2 20 21
70 360 990 40 2 14 16
71 630 1540 56 3 32 32
72 480 1370 42 3 36 19
73 610 1340 56 3 27 31
74 450 1170 42 3 30 18
75 670 1480 68 5 27 33
76 520 1320 55 5 31 20
77 540 1260 61 3 23 23
78 380 1090 47 3 27 10
79 190 360 12 1 9 12
80 280 540 18 1 13 18
81 470 900 30 2 22 30
82 940 1800 59 3 44 59
83 1880 3600 118 6 87 118
84 390 590 39 2 15 19
85 140 300 10 3 9 7
86 380 860 22 2 25 21
87 220 690 8 2 29 8
88 140 150 20 6 6 4.5
89 450 850 42 7 23 22
90 290 680 28 7 27 8
91 340 780 37 1 14 15
92 260 700 30 1 16 8
93 330 730 34 1 14 15
94 250 650 27 1 16 8
95 360 810 32 1 15 20
96 280 720 25 1 16 13
97 230 130 30 2 2 11
98 340 190 44 4 4 16
99 510 290 67 5 6 24
100 110 65 15 1 1 5
101 20 10 4 1 1 0
102 15 0 4 0 0 0
103 150 70 30 1 4 2
104 250 170 32 4 2 13
105 160 90 21 1 2 8
106 150 135 22 1 2 6
107 45 20 7 0 1 1.5
108 330 170 53 1 8 9
109 340 150 60 0 7 8
110 280 85 49 0 6 6
111 140 0 39 0 0 0
112 200 5 55 0 0 0
113 280 5 76 0 0 0
114 100 0 28 0 0 0
115 0 10 0 0 0 0
116 0 20 0 0 0 0
117 0 35 0 0 0 0
118 0 15 0 0 0 0
119 140 45 37 0 0 0
120 190 65 53 0 0 0
121 270 90 72 0 0 0
122 100 30 27 0 0 0
123 0 70 0 0 2 0
124 0 100 0 0 3 0
125 0 140 0 0 4 0
126 0 50 0 0 1 0
127 140 30 37 0 0 0
128 200 45 54 0 0 0
129 280 60 74 0 0 0
130 100 25 27 0 0 0
131 100 125 12 0 8 2.5
132 130 135 23 1 9 0
133 80 15 21 0 0 0
134 150 0 34 0 2 0
135 190 0 44 0 3 0
136 280 5 65 0 4 0
137 0 0 0 0 0 0
138 0 10 0 0 0 0
139 0 10 0 0 0 0
140 0 15 0 0 0 0
141 0 5 0 0 0 0
142 150 10 36 0 1 0
143 180 10 45 0 1 0
144 220 10 54 0 1 0
145 110 5 27 0 0 0
146 0 0 0 0 0 0
147 0 0 0 0 0 0
148 0 0 0 0 0 0
149 170 115 15 1 9 9
150 210 140 18 1 11 10
151 280 180 24 1 15 14
152 270 115 40 1 9 9
153 340 140 50 1 11 10
154 430 180 62 1 15 14
155 270 115 40 1 9 9
156 330 140 50 1 11 10
157 430 180 62 1 15 14
158 260 115 38 1 9 9
159 330 140 48 1 11 10
160 420 190 60 1 15 14
161 210 150 24 1 9 9
162 260 190 29 1 12 10
163 330 240 37 2 15 14
164 100 110 15 1 10 0
165 130 135 19 1 12 0
166 170 180 25 1 16 0.5
167 200 110 41 1 10 0
168 250 135 51 1 12 0
169 310 180 63 1 16 0.5
170 200 110 40 1 10 0
171 250 135 51 1 12 0
172 310 180 63 1 16 0.5
173 190 115 39 1 10 0
174 240 140 49 1 12 0
175 300 180 60 1 16 0.5
176 140 150 24 1 10 0
177 170 180 30 1 12 0
178 220 240 38 2 16 0.5
179 340 150 49 2 10 11
180 410 190 60 2 13 14
181 500 240 72 2 16 17
182 270 150 49 2 11 3.5
183 330 190 60 2 13 3.5
184 390 240 73 2 17 4
185 320 170 45 1 10 11
186 390 220 55 1 12 14
187 480 270 66 1 16 17
188 250 170 45 1 10 3.5
189 310 210 56 1 13 3.5
190 370 270 67 1 17 3.5
191 360 180 50 1 11 13
192 440 220 61 1 14 16
193 540 280 73 1 17 20
194 280 180 50 1 12 3.5
195 340 220 61 1 14 3.5
196 400 280 74 1 19 3.5
197 140 35 23 0 1 4.5
198 190 50 31 0 1 7
199 270 75 47 0 2 9
200 130 35 22 0 1 4.5
201 180 50 29 0 1 7
202 260 65 43 0 2 9
203 130 35 21 0 1 4.5
204 180 50 29 0 1 7
205 250 75 43 0 2 9
206 120 40 20 0 1 4.5
207 170 55 27 0 1 7
208 240 80 41 0 2 9
209 80 65 9 0 1 4.5
210 120 90 12 0 1 7
211 160 135 18 0 2 9
212 290 125 41 1 8 11
213 350 150 50 1 9 13
214 480 220 70 2 14 16
215 240 125 41 1 8 5
216 290 150 50 1 10 5
217 390 220 71 2 14 6
218 280 140 38 0 8 11
219 340 170 46 1 9 13
220 460 250 65 1 13 16
221 230 140 38 0 8 5
222 270 170 47 1 10 5
223 370 250 65 1 14 6
224 450 125 65 1 7 18
225 550 160 80 1 9 22
226 670 190 98 1 11 26
227 450 125 64 0 7 19
228 550 160 79 0 9 23
229 670 190 96 0 11 27
230 530 135 76 1 8 23
231 630 160 91 1 9 26
232 760 200 111 1 12 31
233 220 40 50 3 2 0.5
234 260 50 62 4 3 1
235 340 65 79 5 4 1
236 210 50 47 3 3 0.5
237 250 60 58 3 4 1
238 330 80 74 4 5 1
239 210 40 50 1 2 0.5
240 260 45 61 1 3 1
241 340 60 78 2 4 1
242 530 160 86 0 11 15
243 660 200 109 0 14 19
244 820 260 135 0 18 23
245 550 160 90 0 12 16
246 690 210 114 0 15 20
247 850 260 140 0 18 24
248 560 240 91 1 12 16
249 700 300 114 2 15 20
250 850 380 141 2 19 23
251 660 210 109 0 14 19
252 820 260 135 0 18 23
253 650 180 96 1 13 23
254 930 260 139 2 20 33
255 430 120 64 1 9 15
256 510 280 80 1 12 17
257 690 380 106 1 15 23
258 340 190 53 1 8 11
259 810 400 114 2 21 32
260 410 200 57 1 10 16
;
Table NT(j, k) 'recommended nutritional value k (columns) for group j'
1 2 3 4 5 6
1 1400 2050 130 19.6 26.5 30
2 1600 2050 130 22.4 26.5 30
3 1800 2300 130 25.2 46 30
4 2800 2300 130 30.8 52 30
5 2000 2300 130 28 46 30
6 2600 2300 130 33.6 56 30
7 1800 2300 130 25.2 46 30
8 2200 2300 130 30.8 56 30
;
Variables
z 'objective function variable-total minimum cost'
x(i,j) 'amount of item i to eat for group j'
u(i,j) 'uniqueness'
Integer variables x;
Binary variables u;
Equations
Objective 'objective function - minimized cost to meet nutritional requirements'
NutritionNeedConst(j,k) 'nutrition needs constrains for group j and macronutrient k'
DiversityConst(i,j) 'something'
BreakfastConst(j) 'require at least a set number of breakfast items'
ChickenFishConst(j)
BeefPorkConst(j) 'require at least a set number of beef and pork items'
SaladsConst(j)
SnacksSidesConst(j)
DessertConst(j)
BeveragesConst(j)
CoffeeTeaConst(j)
SmoothiesShakesConst(j)
LowerBoundConst(i,j);
Objective.. z =e= sum((i,j), c(i) * x(i,j));
NutritionNeedConst(j,k).. sum(i, n(i,k) * x(i,j)) =g= NT(j,k);
DiversityConst(i,j).. x(i,j) =l= 3 * u(i,j);
BreakfastConst(j).. sum(i$(ord(i) < 43), u(i,j)) =g= 1;
ChickenFishConst(j).. sum(i$(ord(i) > 42 and ord(i) < 58), u(i,j)) =g= 1;
BeefPorkConst(j).. sum(i$(ord(i) > 57 and ord(i) < 85), u(i,j)) =g= 1;
SaladsConst(j).. sum(i$(ord(i) > 84 and ord(i) < 91), u(i,j)) =g= 1;
SnacksSidesConst(j).. sum(i$(ord(i) > 90 and ord(i) < 104), u(i,j)) =g= 1;
DessertConst(j).. sum(i$(ord(i) > 103 and ord(i) < 111), u(i,j)) =g= 1;
BeveragesConst(j).. sum(i$(ord(i) > 110 and ord(i) < 138), u(i,j)) =g= 1;
CoffeeTeaConst(j).. sum(i$(ord(i) > 137 and ord(i) < 233), u(i,j)) =g= 1;
SmoothiesShakesConst(j).. sum(i$(ord(i) > 232), u(i,j)) =g= 1;
LowerBoundConst(i,j).. x(i,j) =g= u(i,j)
Model food /all/;
Solve food using MIP minimizing z;
Display x.l;