質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1975閲覧

python gurobi 最適化の繰り返し

asm9922

総合スコア12

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/22 01:16

Python3,gurobiにて、最適化問題(栄養問題の類似)を解きたいです。

[プログラムの目的]
複数日にわたり、食事と運動を提案する。
[現状の問題点]
1日分の提案を行うコードは書けたのですが、複数日(試作コードでは簡単のため2日に設定)にわたる提案を行うコードが思う通りに動きません。
私は単純に、2次元の配列を用意してfor文で最適化プログラムを回せば良いと考えたのですが、解の出力が思う通りになりませんでした。

python3

1import pandas as pd 2from gurobipy import * 3 4#csv読み込み 5dfk = pd.read_csv("food.csv", index_col=0,usecols=[0,2]) 6dfc = pd.read_csv("food.csv", index_col=0, usecols=[0,1]) 7df1 = pd.read_csv("food.csv", index_col=0) 8df2 = pd.read_csv("exercise.csv", index_col=0) 9df3 = pd.read_csv("fbound.csv", index_col=0) 10df4 = pd.read_csv("ejudge.csv", index_col=0) 11df5 = pd.read_csv("egbound.csv", index_col=0) 12df6 = pd.read_csv("fjudge.csv", index_col=0) 13df7 = pd.read_csv("fgbound.csv", index_col=0) 14 15#辞書化 行をキーに、列と値をバリューにするオプション 16d1 = df1.to_dict(orient='index') 17d2 = df2.to_dict(orient='index') 18d3 = df3.to_dict(orient='index') 19d4 = df4.to_dict(orient='index') 20d5 = df5.to_dict(orient='index') 21d6 = df6.to_dict(orient='index') 22d7 = df7.to_dict(orient='index') 23 24dc = dict(zip(dfc.index, dfc['価格'])) 25d2i = dict(zip(df2.index, df2['運動強度 I'])) 26dk = dict(zip(dfk.index, dfk['カロリー'])) 27 28#モデル化 29model = Model() 30#変数オブジェクト生成 31x, y = {}, {} 32 33#変数(2次元配列で用意) 34#food 35for t in range(2): 36 for j in d1.keys(): 37 x[t,j] = model.addVar(vtype="B",name="%s"%j) 38 model.update() 39#exercise 40 for j in d2.keys(): 41 y[t,j] = model.addVar(vtype="B",name="%s"%j) 42 model.update() 43 44#制約 45#食品・運動の重複をなくす 46for j in d1.keys(): 47 model.addConstr(quicksum(x[t,j] for t in range(2)) <= 1) 48for j in d2.keys(): 49 model.addConstr(quicksum(y[t,j] for t in range(2)) <= 1) 50#栄養素の分だけ制約式を用意 栄養素の制約 51for t in range(2): 52 for i in d3.keys(): 53 model.addConstr(quicksum(d1[j][i]*x[t,j] for j in d1.keys()) >= d3[i]["LB"]) 54 model.addConstr(quicksum(d1[j][i]*x[t,j] for j in d1.keys()) <= d3[i]["UB"]) 55#運動強度の制約 56 model.addConstr(quicksum(d2i[j]*y[t,j] for j in d2.keys()) >= 2) 57 model.addConstr(quicksum(d2i[j]*y[t,j] for j in d2.keys()) <= 5) 58#運動グループの制約 59 for i in d5.keys(): 60 model.addConstr(quicksum(d4[j][i]*y[t,j] for j in d4.keys()) >= d5[i]["LB"]) 61 model.addConstr(quicksum(d4[j][i]*y[t,j] for j in d4.keys()) <= d5[i]["UB"]) 62#食品グループの制約 63 for i in d7.keys(): 64 model.addConstr(quicksum(d6[j][i]*x[t,j] for j in d1.keys()) >= d7[i]["LB"]) 65 model.addConstr(quicksum(d6[j][i]*x[t,j] for j in d1.keys()) <= d7[i]["UB"]) 66#消費カロリーの制約 67 model.addConstr(quicksum(dk[j]*x[t,j] for j in d1.keys()) +80 <= 566 + quicksum(d2i[j]*y[t,j]*67 for j in d2.keys())) 68 69#目的関数 70 model.setObjective(quicksum(dc[j]*x[t,j] for j in d1.keys()), GRB.MINIMIZE) 71 72#最適化 73 model.optimize() 74#定式化が正しいか確認 75 model.update() 76 model.write("model.lp") 77 78#解の表示 79 status = model.Status 80 if status == GRB.Status.OPTIMAL: 81 print("Total Cost = ", model.ObjVal) 82 for [t,j] in x: 83 if x[t,j].X == 1: 84 print(x[t,j].VarName) 85 for [t,j] in y: 86 if y[t,j].X == 1: 87 print(y[t,j].Varname) 88

出力
Total Cost = 436.0
コールスローサラダロール
味付き半熟ゆでたまご1個入り
マカロニサラダ
豚汁
バービー(202)
バービー(15
3)
腕立て伏せ(303)
ブラジリアンスクワット(15
3)

Total Cost = 436.0
トマトの彩り野菜サンド
キノコのマリネ
三陸産わかめのサラダ
絹とうふ
クラムチャウダー
コールスローサラダロール
味付き半熟ゆでたまご1個入り
マカロニサラダ
豚汁
クランチ(303)
バービー(20
3)
腕立て伏せ(203)
ラウンジ(20
3)
バービー(103)
ダブルレッグレイズ(20
3)
腕立て伏せ(303)
ブラジリアンスクワット(15
3)

[理想の出力]
Total Cost = 436.0
コールスローサラダロール
味付き半熟ゆでたまご1個入り
マカロニサラダ
豚汁
バービー(202)
バービー(15
3)
腕立て伏せ(303)
ブラジリアンスクワット(15
3)

Total Cost = *****(another value)
トマトの彩り野菜サンド
キノコのマリネ
三陸産わかめのサラダ
絹とうふ
クラムチャウダー
クランチ(30
3)
バービー(203)
腕立て伏せ(20
3)
ラウンジ(20*3)

何卒、皆様のお力を貸していただけると幸いです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問