食事プランの最適化 PuLP

食事プランの最適化

最適化問題の例として食事プランの最適化問題を考えてみます。

この問題では、1週間の食事プランを最適化し、必要な栄養素をバランスよく摂取しながら、予算内で食材を購入することを目的とします。

以下は、PuLPを使用してこの問題を解くためのソースコードです。

[Google Colaboratory]

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
from pulp import *

# 問題の定義
prob = LpProblem("Meal Planning", LpMinimize)

# 変数の定義
chicken = LpVariable("Chicken", lowBound=0.1)
beef = LpVariable("Beef", lowBound=0.1)
fish = LpVariable("Fish", lowBound=0.1)

# 制約条件の設定
prob += 3 * chicken + 4 * beef + 2 * fish >= 7.5
prob += 2 * chicken + 3 * beef + 1.5 * fish >= 6
prob += 0.5 * chicken + beef + 0.3 * fish >= 1.5
prob += 3 * chicken + 4 * beef + 2 * fish <= 30
prob += 2 * chicken + 3 * beef + 1.5 * fish <= 25
prob += 0.5 * chicken + beef + 0.3 * fish <= 5

# 目的関数の設定
prob += 5 * chicken + 7 * beef + 6 * fish

# 問題の解法
status = prob.solve()

# 結果の出力
print("Status:", LpStatus[status])
print("Optimal Solution:")
for var in prob.variables():
print(var.name, "=", var.varValue)
print("Total Cost of Ingredients = ", value(prob.objective))

上記のコードでは、変数 chicken、beef、fish はそれぞれ、鶏肉、牛肉、魚介類の購入量を表しています。


prob += 式 不等号 式で制約条件を、prob += 式 で目的関数を設定しています。

制約条件目的関数の違いは、不等号があるかどうかです。


制約条件は、それぞれ栄養素のバランスを保つための条件です。

例えば、4つ目の制約条件は、タンパク質の摂取量が30グラム以下であることを表しています。

目的関数は、食材の総額を最小化することを目的としています。


最後に、prob.solve() で問題を解き、結果を出力しています。

結果は、各変数(食材)の最適値と、食材の総額です。


このコードを実行すると、以下のような結果が得られます。

[実行結果]

Status: Optimal
Optimal Solution:
Beef = 1.8833333
Chicken = 0.1
Fish = 0.1
Total Cost of Ingredients =  14.2833331

これは、最適な食事プランが、牛肉1.88ポンド、鶏肉0.1ポンド、魚介類0.1ポンドであることを示しています。

また、このプランの食材の総額は14.28ドルであることがわかります。