def main(): #問題の定義 最小化か最大化か # 今回はカロリーを最小化したい。 problem = pulp.LpProblem(name="1日の栄養素を満たすメニュー", sense=pulp.LpMinimize) data = {"shop": ["dennys", "macdonalds"]} MenuDict = menu_dict(data["shop"]) #print("wx: ",MenuDict) # メニューリストを自動で取得するようにする。のちに選択式になる予定。 data = { "menu": [ "てりやきマックバーガー", "ハンバーガー", "チーズバーガー", "ベーコンレタスバーガー", "チキンフィレオ", "えびフィレオ", "フィレオフィッシュ", "ダブルチーズバーガー", "ビッグマック", "チキンマックナゲット 5ピース", "マックフライポテト(L)", "マックフライポテト(M)", "マックフライポテト(S)", "ホットアップルパイ", "ワッフルコーン プレーン", "マックフルーリーオレオ", "プチパンケーキ", "三角チョコパイ 黒", "スイートコーン", "サイドサラダ", "ハッシュポテト", "コカ・コーラ", "アイスカフェラテ", "キャラメルラテ", "マックシェイクバニラ", "マックシェイクチョコレート", "ミニッツメイドオレンジ", ] } if not data["menu"]: target_menu_list = list(MenuDict.keys()) else: target_menu_list = data["menu"] #print("target_menu_list:",target_menu_list) # メニューリスト # target_menu_list = [ # "てりやきマックバーガー", # "ハンバーガー", # "チーズバーガー", # "ベーコンレタスバーガー", # "チキンフィレオ", # "えびフィレオ", # "フィレオフィッシュ", # "ダブルチーズバーガー", # "ビッグマック", # "チキンマックナゲット 5ピース", # "マックフライポテト(L)", # "マックフライポテト(M)", # "マックフライポテト(S)", # "ホットアップルパイ", # "ワッフルコーン プレーン", # "マックフルーリーオレオ", # "プチパンケーキ", # "三角チョコパイ 黒", # "スイートコーン", # "サイドサラダ", # "ハッシュポテト", # "コカ・コーラ", # "アイスカフェラテ", # "キャラメルラテ", # "マックシェイクバニラ", # "マックシェイクチョコレート", # "ミニッツメイドオレンジ", # ] # # print("\n") # print("target_menu_list",target_menu_list) one_da_nutrition_dict = old_one_da_nutrition_dict() #print("one_da_nutrition_dict:",one_da_nutrition_dict) # 対象とする栄養素について、対象の商品リストごとの栄養価を、リスト形式で作成する eiyou_data = {} for key in one_da_nutrition_dict.keys(): # keyに入っている栄養の名称を、データのdictのkeyにする。 eiyou_data[key] = get_nutrition_val_list(MenuDict, target_menu_list, key) #print("eiyou_data",eiyou_data) # 変数の定義 #LpVariableで自由辺巣を作成。値は-∞から∞まで #lowBoundで0から∞まで #catで変数の種類指定 # 上限を指定 upbound = 10 xs = up_limit(target_menu_list, upbound) #print("xs:",xs) # 目的関数:カロリーを最小化 # lpdot:二つのリストのない席を求める。 problem += pulp.lpDot(eiyou_data["エネルギー[kcal]"], xs) #制約条件: 一日に必要内容量をそれぞれ満たすこと # 条件カスタマイズ&ON-OFFしやすいように、あえてループ外で起債。 #食塩相当については、「以内」としている。解が存在スカは要注意 # 栄養素を存在するかどうかをkeyがあるかどうかの判定にする # この場合だとメニューを組み合わせたときにエラーが起こる for key in eiyou_data.keys(): if key == "食塩相当量[g]": continue # メニューの数と栄養素のデータの数が一致しないときは計算しない。 if len(eiyou_data[key]) == len(target_menu_list): #print("eiyou_data[key]",len(eiyou_data[key]),len(target_menu_list)) problem += pulp.lpDot(eiyou_data[key], xs) >= float( one_da_nutrition_dict[key]) problem += pulp.lpDot(eiyou_data["食塩相当量[g]"], xs) <= float( one_da_nutrition_dict["食塩相当量[g]"]) #与えられた問題の内容を表示 #print(problem) status = problem.solve() print("Status:", pulp.LpStatus[status]) # Statusがoptionalなら解が見つかっている。 if pulp.LpStatus[status] == "Optimal": #簡易結果表示 #print([x.value() for x in xs]) #print(problem.objective.value()) # 変数名ごとに表示 print("「一日に必要な栄養素を摂取するには」") for x in xs: #print("x.value:",x.value) print(str(x), ":", str(int(x.value())), "個") print("\n") # それぞれの栄養素がいくらか print("栄養素の値") for key in one_da_nutrition_dict: print(key, ":", str(one_da_nutrition_dict[key]), "に対し", str(round(pulp.lpDot(eiyou_data[key], xs).value()))) else: print("結果が求められていないか、ERRORか")
def index(): # error構文を追加 もしGETが正常じゃないとき try: # 問題の定義 最小化か最大化か # 今回はカロリーを最小化したい。 problem = pulp.LpProblem(name="1日の栄養素を満たすメニュー", sense=pulp.LpMinimize) # 店をどこを選択したかをデータで受け取り、csvのどれを読み込むかを決める。 data = request.get_json()["data"] print("data:", data) # ここで店の名前を["dennys","macdonalds"]のようにリストとして受け取って欲しい。 MenuDict = menu_dict(data["shop"]) # メニューリストをcsvから自動取得 # data["menu"]から選択されたメニューを受け取る # data["menu"]が空の場合は全メニュー選ぶ # このメニューもリストとして返して欲しい if not data["menu"]: target_menu_list = list(MenuDict.keys()) else: target_menu_list = data["menu"] gender = int(data["gender"]) old = int(data["old"]) up_value = int(data["up_value"]) # print("gender:",gender,"old:",old) #gender,old = map(int,input().split()) one_da_nutrition_dict = old_one_da_nutrition_dict(gender, old) # print("one_da_nutrition_dict:",one_da_nutrition_dict) eiyou_data, xs, status, cal_key = find(problem, data, MenuDict, target_menu_list, one_da_nutrition_dict) print("Status:", pulp.LpStatus[status]) # Statusがoptionalなら解が見つかっている。 if pulp.LpStatus[status] == "Optimal": # 簡易結果表示 # print([x.value() for x in xs]) # print(problem.objective.value()) # 変数名ごとに表示 one_da_neces_nutrition = {} for x in xs: # print(str(x),":",str(int(x.value())),"個") one_da_neces_nutrition[str(x)] = str(int(x.value())) + "個" # それぞれの栄養素がいくらか # nutrition_comp 一日に必要な栄養素の比較 nutrition_comp = {} for key in one_da_nutrition_dict: if str(round(pulp.lpDot(eiyou_data[key], xs).value())) != 0: print(key, ":", str(one_da_nutrition_dict[key]), "に対し", str(round(pulp.lpDot(eiyou_data[key], xs).value()))) nutrition_comp[key] = str( one_da_nutrition_dict[key]) + "に対し" + str( round(pulp.lpDot(eiyou_data[key], xs).value())) response = [one_da_neces_nutrition, nutrition_comp] return make_response(jsonify(response)) # 条件にあった解が見つからなかった時はerrorを返す else: rec_problem = pulp.LpProblem(name="1日の栄養素を満たす追加のメニュー", sense=pulp.LpMinimize) recommend_menu_list, one_da_nutrition_dict = recommend( MenuDict, target_menu_list, one_da_nutrition_dict, eiyou_data) if not recommend_menu_list: print("残念ながら選択されたお店では一日の栄養素を満たすものはないようです") exit() eiyou_data, xs, re_status, cal_key = find(rec_problem, data, MenuDict, recommend_menu_list, one_da_nutrition_dict) # 変数名ごとに表示 if pulp.LpStatus[re_status] == "Optimal": rec_menu = {} print("追加でこんなメニューはどうですか") for x in xs: if int(x.value()) != 0: #print("x.value:",x.value) print(str(x), ":", str(int(x.value())), "個") rec_menu[str(x)] = str(int(x.value())) + "個" response = [rec_menu] return make_response(jsonify(response)) else: print("もう一度メニューを考え直してみよう") response = 'error' return make_response(jsonify(response)) except: return """
def index(): # error構文を追加 もしGETが正常じゃないとき try: # 問題の定義 最小化か最大化か # 今回はカロリーを最小化したい。 problem = pulp.LpProblem(name="1日の栄養素を満たすメニュー", sense=pulp.LpMinimize) # 店をどこを選択したかをデータで受け取り、csvのどれを読み込むかを決める。 data = request.get_json()["data"] print("data:", data) # ここで店の名前を["dennys","macdonalds"]のようにリストとして受け取って欲しい。 MenuDict = menu_dict(data["shop"]) # メニューリストをcsvから自動取得 # data["menu"]から選択されたメニューを受け取る # data["menu"]が空の場合は全メニュー選ぶ # このメニューもリストとして返して欲しい if not data["menu"]: target_menu_list = list(MenuDict.keys()) else: target_menu_list = data["menu"] gender = int(data["gender"]) old = int(data["old"]) up_value = int(data["up_value"]) # print("gender:",gender,"old:",old) #gender,old = map(int,input().split()) one_da_nutrition_dict = old_one_da_nutrition_dict(gender, old) # print("one_da_nutrition_dict:",one_da_nutrition_dict) # 対象とする栄養素について、対象の商品リストごとの栄養価を、リスト形式で作成する eiyou_data = {} for key in one_da_nutrition_dict.keys(): # keyに入っている栄養の名称を、データのdictのkeyにする。 eiyou_data[key] = get_nutrition_val_list(MenuDict, target_menu_list, key) # 変数の定義 # LpVariableで自由辺巣を作成。値は-∞から∞まで # lowBoundで0から∞まで # catで変数の種類指定 # 商品の上限指定 #print("up_value:", up_value) xs = up_limit(target_menu_list, up_value) # 目的関数:カロリーを最小化 # lpdot:二つのリストのない席を求める。 problem += pulp.lpDot(eiyou_data["エネルギー[kcal]"], xs) # 制約条件: 一日に必要内容量をそれぞれ満たすこと # 条件カスタマイズ&ON-OFFしやすいように、あえてループ外で起債。 # 食塩相当については、「以内」としている。解が存在スカは要注意 for key in eiyou_data.keys(): # 食塩は以下なので別個でやる if key == "食塩相当量[g]": continue # メニューの数と栄養素のデータの数が一致しないときは計算しない。 if len(eiyou_data[key]) == len(target_menu_list): #print("eiyou_data[key]",len(eiyou_data[key]),len(target_menu_list)) problem += pulp.lpDot(eiyou_data[key], xs) >= float( one_da_nutrition_dict[key]) problem += pulp.lpDot(eiyou_data["食塩相当量[g]"], xs) <= float( one_da_nutrition_dict["食塩相当量[g]"]) # 与えられた問題の内容を表示 # print(problem) status = problem.solve() print("Status:", pulp.LpStatus[status]) # Statusがoptionalなら解が見つかっている。 if pulp.LpStatus[status] == "Optimal": # 簡易結果表示 #print([x.value() for x in xs]) # print(problem.objective.value()) # 変数名ごとに表示 one_da_neces_nutrition = {} for x in xs: # print(str(x),":",str(int(x.value())),"個") one_da_neces_nutrition[str(x)] = str(int(x.value())) + "個" # それぞれの栄養素がいくらか # nutrition_comp 一日に必要な栄養素の比較 nutrition_comp = {} for key in one_da_nutrition_dict: if str(round(pulp.lpDot(eiyou_data[key], xs).value())) != 0: print(key, ":", str(one_da_nutrition_dict[key]), "に対し", str(round(pulp.lpDot(eiyou_data[key], xs).value()))) nutrition_comp[key] = str( one_da_nutrition_dict[key]) + "に対し" + str( round(pulp.lpDot(eiyou_data[key], xs).value())) response = [one_da_neces_nutrition, nutrition_comp] return make_response(jsonify(response)) # 条件にあった解が見つからなかった時はerrorを返す else: response = 'error' return make_response(jsonify(response)) except: return """
def index(): #問題の定義 最小化か最大化か # 今回はカロリーを最小化したい。 problem = pulp.LpProblem(name="1日の栄養素を満たすメニュー", sense=pulp.LpMinimize) data = {"shop": ["dennys"]} MenuDict = menu_dict(data["shop"]) print("MenuDict: ", MenuDict) # メニューリストを自動で取得するようにする。のちに選択式になる予定。 data = {"menu": []} if not data["menu"]: target_menu_list = list(MenuDict.keys()) else: target_menu_list = data["menu"] #print("target_menu_list",target_menu_list) one_da_nutrition_dict = old_one_da_nutrition_dict() #print("one_da_nutrition_dict:",one_da_nutrition_dict) eiyou_data, xs, status, cal_key = find(problem, data, MenuDict, target_menu_list, one_da_nutrition_dict) #与えられた問題の内容を表示 #print(problem) print("Status:", pulp.LpStatus[status]) # Statusがoptionalなら解が見つかっている。 if pulp.LpStatus[status] == "Optimal": #簡易結果表示 #print([x.value() for x in xs]) #print(problem.objective.value()) # 変数名ごとに表示 print("「一日に必要な栄養素を摂取するには」") for x in xs: #print(x) if int(x.value()) != 0: #print("x.value:",x.value) print(str(x), ":", str(int(x.value())), "個") print("\n") # それぞれの栄養素がいくらか print("栄養素の値") for key in cal_key: print(key, ":", str(one_da_nutrition_dict[key]), "に対し", str(round(pulp.lpDot(eiyou_data[key], xs).value()))) else: print("結果が求められていないか、ERRORか") # メニューリストを選択されたものを除外と選択されたものの栄養素を抜いた値を使用する。 rec_problem = pulp.LpProblem(name="1日の栄養素を満たす追加のメニュー", sense=pulp.LpMinimize) recommend_menu_list, one_da_nutrition_dict = recommend( MenuDict, target_menu_list, one_da_nutrition_dict, eiyou_data) # 全メニューが選択されたにもかかわらず、一日の栄養素を満たさない場合。 if not recommend_menu_list: print("残念ながら選択されたお店では一日の栄養素を満たすものはないようです") exit() eiyou_data, xs, re_status, cal_key = find(rec_problem, data, MenuDict, recommend_menu_list, one_da_nutrition_dict) # 変数名ごとに表示 if pulp.LpStatus[re_status] == "Optimal": print("追加でこんなメニューはどうですか") for x in xs: #print(x,x.value()) if x.value() != None and int(x.value()) != 0: #print("x.value:",x.value) print(str(x), ":", str(int(x.value())), "個") print("\n") else: print("!!!!残念ながら選択されたお店では一日の栄養素を満たすものはないようです")