from IPython.core.display import HTML HTML(open("styles/custom.css", "r").read()) import pandas as pd req = { 'A' : [700, 10000], 'C' : [700, 10000], 'B1': [700, 10000], 'B2': [700, 10000]} display(pd.DataFrame(req.values(), index = req.keys(), columns = ['n_min', 'n_max'])) nutr = { 'BEF' : {'A': 60, 'C': 20, 'B1': 10, 'B2': 15}, 'CHK' : {'A': 8, 'C': 0, 'B1': 20, 'B2': 20}, 'FSH' : {'A': 8, 'C': 10, 'B1': 15, 'B2': 10}, 'HAM' : {'A': 40, 'C': 40, 'B1': 35, 'B2': 10}, 'MCH' : {'A': 15, 'C': 35, 'B1': 15, 'B2': 15}, 'MTL' : {'A': 70, 'C': 30, 'B1': 15, 'B2': 15}, 'SPG' : {'A': 25, 'C': 50, 'B1': 25, 'B2': 15}, 'TUR' : {'A': 60, 'C': 20, 'B1': 15, 'B2': 10}} display(pd.DataFrame.from_dict(nutr).transpose()) price ={'BEF' : ['Beef', 3.19], 'CHK' : ['Chicken', 2.59], 'FSH' : ['Fish', 2.29], 'HAM' : ['Ham', 2.89], 'MCH' : ['Macaroni & Cheese', 1.89], 'MTL' : ['Meat Loaf', 1.99], 'SPG' : ['Spaghetti', 1.99], 'TUR' : ['Turkey', 2.49]} display(pd.DataFrame(price.values(), index = price.keys(), columns = ['food','price'])) %%script glpsol -m /dev/stdin -o /dev/stdout var xBEF >= 0; var xCHK >= 0; var xFSH >= 0; var xHAM >= 0; var xMCH >= 0; var xMTL >= 0; var xSPG >= 0; var xTUR >= 0; minimize Total_Cost: 3.19*xBEF + 2.59*xCHK + 2.29*xFSH + 2.89*xHAM + 1.89*xMCH + 1.99*xMTL + 1.99*xSPG + 2.49*xTUR; subject to A: 700 <= 60*xBEF + 8*xCHK + 8*xFSH + 40*xHAM + 15*xMCH + 70*xMTL + 25*xSPG + 60*xTUR <= 10000; subject to C: 700 <= 20*xBEF + 0*xCHK + 10*xFSH + 40*xHAM + 35*xMCH + 30*xMTL + 50*xSPG + 20*xTUR <= 10000; subject to B1: 700 <= 10*xBEF + 20*xCHK + 15*xFSH + 35*xHAM + 15*xMCH + 15*xMTL + 25*xSPG + 15*xTUR <= 10000; subject to B2: 700 <= 15*xBEF + 20*xCHK + 10*xFSH + 10*xHAM + 15*xMCH + 15*xMTL + 15*xSPG + 10*xTUR <= 10000; end; %%script glpsol -m /dev/stdin -o /dev/stdout --out output set FOODS := {'BEF','CHK','FSH','HAM','MCH','MTL','SPG','TUR'}; var x{FOODS} >= 0; minimize Total_Cost: 3.19*x['BEF'] + 2.59*x['CHK'] + 2.29*x['FSH'] + 2.89*x['HAM'] + 1.89*x['MCH'] + 1.99*x['MTL'] + 1.99*x['SPG'] + 2.49*x['TUR']; subject to A: 700 <= 60*x['BEF'] + 8*x['CHK'] + 8*x['FSH'] + 40*x['HAM'] + 15*x['MCH'] + 70*x['MTL'] + 25*x['SPG'] + 60*x['TUR'] <= 10000; subject to C: 700 <= 20*x['BEF'] + 0*x['CHK'] + 10*x['FSH'] + 40*x['HAM'] + 35*x['MCH'] + 30*x['MTL'] + 50*x['SPG'] + 20*x['TUR'] <= 10000; subject to B1: 700 <= 10*x['BEF'] + 20*x['CHK'] + 15*x['FSH'] + 35*x['HAM'] + 15*x['MCH'] + 15*x['MTL'] + 25*x['SPG'] + 15*x['TUR'] <= 10000; subject to B2: 700 <= 15*x['BEF'] + 20*x['CHK'] + 10*x['FSH'] + 10*x['HAM'] + 15*x['MCH'] + 15*x['MTL'] + 15*x['SPG'] + 10*x['TUR'] <= 10000; end; %%script glpsol -m /dev/stdin -o /dev/stdout --out output set FOODS; set NUTRS; param price{FOODS} >= 0; param n_min{NUTRS} >= 0; param n_max{NUTRS} >= 0; var x{FOODS} >= 0; minimize Total_Cost: sum {f in FOODS} price[f]*x[f]; subject to A: n_min['A'] <= 60*x['BEF'] + 8*x['CHK'] + 8*x['FSH'] + 40*x['HAM'] + 15*x['MCH'] + 70*x['MTL'] + 25*x['SPG'] + 60*x['TUR'] <= n_max['A']; subject to C: n_min['C'] <= 20*x['BEF'] + 0*x['CHK'] + 10*x['FSH'] + 40*x['HAM'] + 35*x['MCH'] + 30*x['MTL'] + 50*x['SPG'] + 20*x['TUR'] <= n_max['C']; subject to B1: n_min['B1'] <= 10*x['BEF'] + 20*x['CHK'] + 15*x['FSH'] + 35*x['HAM'] + 15*x['MCH'] + 15*x['MTL'] + 25*x['SPG'] + 15*x['TUR'] <= n_max['B1']; subject to B2: n_min['B2'] <= 15*x['BEF'] + 20*x['CHK'] + 10*x['FSH'] + 10*x['HAM'] + 15*x['MCH'] + 15*x['MTL'] + 15*x['SPG'] + 10*x['TUR'] <= n_max['B2']; data; param : FOODS : price := BEF 3.19 CHK 2.59 FSH 2.29 HAM 2.89 MCH 1.89 MTL 1.99 SPG 1.99 TUR 2.49; param : NUTRS : n_min n_max := A 700 10000 C 700 10000 B1 700 10000 B2 700 10000; end; %%script glpsol -m /dev/stdin -o /dev/stdout --out output set FOODS; set NUTRS; param price{FOODS} >= 0; param n_min{NUTRS} >= 0; param n_max{NUTRS} >= 0; param a{FOODS,NUTRS} >= 0; var x{FOODS} >= 0; minimize Total_Cost: sum {f in FOODS} price[f]*x[f]; subject to n_req {n in NUTRS}: n_min[n] <= sum {f in FOODS} a[f,n] * x[f] <= n_max[n]; data; param : FOODS : price := BEF 3.19 CHK 2.59 FSH 2.29 HAM 2.89 MCH 1.89 MTL 1.99 SPG 1.99 TUR 2.49; param : NUTRS : n_min n_max := A 700 10000 C 700 10000 B1 700 10000 B2 700 10000; param a : A C B1 B2 := BEF 60 20 10 15 CHK 8 0 20 20 FSH 8 10 15 10 HAM 40 40 35 10 MCH 15 35 15 15 MTL 70 30 15 15 SPG 25 50 25 15 TUR 60 20 15 10; end; %%script glpsol -m /dev/stdin -o output.txt -y display.txt --out output set FOODS; set NUTRS; param price{FOODS} >= 0; param x_min{FOODS} >= 0; param x_max{FOODS} >= 0; param n_min{NUTRS} >= 0; param n_max{NUTRS} >= 0; param a{FOODS,NUTRS} >= 0; var x{f in FOODS} >= 0; minimize Total_Cost: sum {f in FOODS} price[f]*x[f]; subject to n_req {n in NUTRS}: n_min[n] <= sum {f in FOODS} a[f,n] * x[f] <= n_max[n]; solve; printf "\nMinimum Cost Diet = %6.2f $/week.\n\n", Total_Cost; table results {f in FOODS} OUT "CSV" "output.csv" "Table": f ~ Food, x[f] ~ Quantity, price[f] ~ Price; data; param : FOODS : price := BEF 3.19 CHK 2.59 FSH 2.29 HAM 2.89 MCH 1.89 MTL 1.99 SPG 1.99 TUR 2.49; param : NUTRS : n_min n_max := A 700 10000 C 700 10000 B1 700 10000 B2 700 10000; param a : A C B1 B2 := BEF 60 20 10 15 CHK 8 0 20 20 FSH 8 10 15 10 HAM 40 40 35 10 MCH 15 35 15 15 MTL 70 30 15 15 SPG 25 50 25 15 TUR 60 20 15 10; end; print output print(open('output.txt').read()) print(open('display.txt').read()) import pandas df = pandas.read_csv('output.csv') display(df) df['Quantity'].plot(kind='bar').set_xticklabels(df['Food']); %%script glpsol -m /dev/stdin -o display.txt --out output set FOODS; set NUTRS; param price{FOODS} >= 0; param x_min{FOODS} >= 0; param x_max{FOODS} >= 0; param n_min{NUTRS} >= 0; param n_max{NUTRS} >= 0; param a{FOODS,NUTRS} >= 0; var x{f in FOODS} integer >= x_min[f], <= x_max[f]; minimize Total_Cost: sum {f in FOODS} price[f]*x[f]; subject to n_req {n in NUTRS}: n_min[n] <= sum {f in FOODS} a[f,n] * x[f] <= n_max[n]; solve; printf "\nMinimum Cost Diet = %6.2f $/week.\n\n", Total_Cost; table results {f in FOODS} OUT "CSV" "output.csv" "Table": f ~ Food, x[f] ~ Quantity, price[f] ~ Price; data; param : FOODS : price x_min x_max := BEF 3.19 2 30 CHK 2.59 2 30 FSH 2.29 2 30 HAM 2.89 2 30 MCH 1.89 2 30 MTL 1.99 2 30 SPG 1.99 2 30 TUR 2.49 2 30; param : NUTRS : n_min n_max := A 700 10000 C 700 10000 B1 700 10000 B2 700 10000 NA 0 40000 CAL 16000 24000; param a : A C B1 B2 NA CAL := BEF 60 20 10 15 938 295 CHK 8 0 20 20 2180 770 FSH 8 10 15 10 945 440 HAM 40 40 35 10 278 430 MCH 15 35 15 15 1182 315 MTL 70 30 15 15 896 400 SPG 25 50 25 15 1329 370 TUR 60 20 15 10 1397 450; end; print output print(open('display.txt').read()) import pandas df = pandas.read_csv('output.csv') display(df) df['Quantity'].plot(kind='bar').set_xticklabels(df['Food']);