栄養最適化 CVXPY

栄養最適化

食事に関する最適化問題の一つとして、特定の栄養素を必要量摂取しつつ、食事のコストを最小化する問題があります。

以下に、この問題をCVXPYを用いて解く例を示します。

まず、必要なライブラリをインポートします。

1
2
3
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt

次に、問題のパラメータを定義します。ここでは、3つの食品(リンゴ、バナナ、オレンジ)と2つの栄養素(ビタミンCとカリウム)を考えます。

1
2
3
4
5
6
7
8
# 各食品のコスト(円)
costs = np.array([100, 50, 80])

# 各食品のビタミンCとカリウムの含有量
nutrients = np.array([[0.5, 0.2], [0.1, 0.3], [0.2, 0.2]])

# 必要なビタミンCとカリウムの量
required_nutrients = np.array([1.0, 0.5])

CVXPYを用いて最適化問題を定義します。

1
2
3
4
5
6
7
# 食品の購入量を表す変数
x = cp.Variable(3, nonneg=True)

# コスト最小化問題を定義
objective = cp.Minimize(costs @ x)
constraints = [nutrients.T @ x >= required_nutrients, x >= 0]
problem = cp.Problem(objective, constraints)

最適化問題を解きます。

1
problem.solve()

最適な購入量を表示します。

1
2
3
print(f"Optimal purchase quantity for Apple: {x.value[0]}")
print(f"Optimal purchase quantity for Banana: {x.value[1]}")
print(f"Optimal purchase quantity for Orange: {x.value[2]}")

最後に、この問題とその解をグラフ化します。

ただし、3つ以上の食品を扱う場合、それら全てを一つのグラフに描画することは難しいため、各食品の最適な購入量を棒グラフで表示します。

1
2
3
4
plt.bar(['Apple', 'Banana', 'Orange'], x.value)
plt.xlabel('Food')
plt.ylabel('Optimal purchase quantity')
plt.show()

このコードは、リンゴ、バナナ、オレンジの最適な購入量を示す棒グラフをプロットします。

[実行結果]