4 Copyright (c) by Joao Pedro PEDROSO and Mikio KUBO, 2012
7 from pyscipopt
import Model, quicksum, multidict
10 """diet -- model for the modern diet problem
14 - a[i]: minimum intake of nutrient i
15 - b[i]: maximum intake of nutrient i
16 - c[j]: cost of food j
17 - d[j][i]: amount of nutrient i in food j
18 Returns a model, ready to be solved.
21 model = Model(
"modern diet")
26 x[j] = model.addVar(vtype=
"I", name=
"x(%s)"%j)
27 y[j] = model.addVar(vtype=
"B", name=
"y(%s)"%j)
29 z[i] = model.addVar(lb=a[i], ub=b[i], name=
"z(%s)"%j)
30 v = model.addVar(vtype=
"C", name=
"v")
34 model.addCons(
quicksum(d[j][i]*x[j]
for j
in F) == z[i], name=
"Nutr(%s)"%i)
36 model.addCons(
quicksum(c[j]*x[j]
for j
in F) == v, name=
"Cost")
39 model.addCons(y[j] <= x[j], name=
"Eat(%s)"%j)
42 model.setObjective(
quicksum(y[j]
for j
in F),
"maximize")
49 """make_inst: prepare data for the diet model"""
51 "QPounder" : [ 1.84, {
"Cal":510,
"Carbo":34,
"Protein":28,
52 "VitA":15,
"VitC": 6,
"Calc":30,
"Iron":20}],
53 "McLean" : [ 2.19, {
"Cal":370,
"Carbo":35,
"Protein":24,
"VitA":15,
54 "VitC": 10,
"Calc":20,
"Iron":20}],
55 "Big Mac" : [ 1.84, {
"Cal":500,
"Carbo":42,
"Protein":25,
56 "VitA": 6,
"VitC": 2,
"Calc":25,
"Iron":20}],
57 "FFilet" : [ 1.44, {
"Cal":370,
"Carbo":38,
"Protein":14,
58 "VitA": 2,
"VitC": 0,
"Calc":15,
"Iron":10}],
59 "Chicken" : [ 2.29, {
"Cal":400,
"Carbo":42,
"Protein":31,
60 "VitA": 8,
"VitC": 15,
"Calc":15,
"Iron": 8}],
61 "Fries" : [ .77, {
"Cal":220,
"Carbo":26,
"Protein": 3,
62 "VitA": 0,
"VitC": 15,
"Calc": 0,
"Iron": 2}],
63 "McMuffin" : [ 1.29, {
"Cal":345,
"Carbo":27,
"Protein":15,
64 "VitA": 4,
"VitC": 0,
"Calc":20,
"Iron":15}],
65 "1% LFMilk": [ .60, {
"Cal":110,
"Carbo":12,
"Protein": 9,
66 "VitA":10,
"VitC": 4,
"Calc":30,
"Iron": 0}],
67 "OrgJuice" : [ .72, {
"Cal": 80,
"Carbo":20,
"Protein": 1,
68 "VitA": 2,
"VitC":120,
"Calc": 2,
"Iron": 2}],
72 "Cal" : [ 2000,
None ],
73 "Carbo" : [ 350, 375 ],
74 "Protein" : [ 55,
None ],
75 "VitA" : [ 100,
None ],
76 "VitC" : [ 100,
None ],
77 "Calc" : [ 100,
None ],
78 "Iron" : [ 100,
None ],
84 if __name__ ==
"__main__":
88 for b[
"Cal"]
in [
None,3500,3000,2500]:
90 print(
"\nDiet for a maximum of {0} calories".format(b[
"Cal"]
if b[
"Cal"] !=
None else "unlimited"))
95 print(
"Optimal value:",model.getObjVal())
98 if model.getVal(x[j]) > 0:
99 print(
"{0:30s}: {1:3.1f} dishes --> {2:4.2f} added to objective".format(j,model.getVal(x[j]),model.getVal(y[j])))
100 print(
"amount spent:",model.getObjVal())
102 print(
"amount of nutrients:")
104 print(
"{0:30s}: {1:4.2f}".format(i,model.getVal(z[i])))