[数理最適化]-栄養バランスが最適化された1日の献立を作成する -
栄養バランスが最適化された1日の献立を作成するためのツールです。
このPythonプログラムは、栄養バランスが最適化された1日の献立を作成するツールです。最適化は「pulp」という線形プログラミングのためのライブラリを使用しています。
(1)はじめに
機械学習と数理最適化 Advent Calendar 2023 チャレンジ の文書です。
の下図のとおり、数理最適化の分です。
1日の献立バランスを最適化するという題で、
pythonのpulpというライブラリを使って、栄養バランスが最適化された1日の献立を作成するツールを作成してみました。
(2)想定している活用シーン
①食事管理アプリやウェブサイトに組み込む
このプログラムも利用して、栄養バランスが最適化された個々のユーザー向けの1日の献立を生成し、食事管理アプリやウェブサイト上で表示することができます。
②食事プランニングツールとして利用する
このプログラムを利用して、栄養バランスの考慮された食事プランニングツールを作成することができます。ユーザーは目標となる栄養素の範囲を設定し、プログラムが最適な献立を生成します。
(3)想定している運用
①健康管理アプリ
ユーザーは自身の身体的な状態や目標を入力し、このプログラムを利用して栄養バランスが最適化された1日の献立を生成することができます。ユーザーにとって最適な食事プランを提供し、健康管理をサポートします。
②レシピサイト
料理のレシピと栄養情報を持つレシピサイトでは、ユーザーが特定の栄養素やカロリーの範囲内で食事を計画するために、このプログラムを活用することができます。ユーザーが栄養バランスが最適なレシピを検索し、献立を組むことができます。
このプログラムは、栄養バランスが最適化された1日の献立を作成するための強力なツールとなることが期待されます。ユーザーは自身の目標や好みを考慮しながら、健康的でバランスの取れた食事プランを作成できます。
(4)コードの概要
ライブラリのインポート:numpy, pandas, pulpをインポートします。
データ設定:指定のCSVファイルを読み込みます。
目的関数の設定:最大化の目的関数を定義し、変数や制約条件を設定します。
制約条件の設定:カロリー、タンパク質、脂質、炭水化物の範囲内での制約条件を定義します。
最適化の実施:定義した制約条件の下で最適化を実行します。
結果出力:合計のカロリー、タンパク質、脂質、炭水化物の摂取量、および選択された料理とその個数を出力します。
(4)コード詳細説明
最適化は「pulp」という線形プログラミングのためのライブラリを使用しています。プログラムは以下のステップに分かれています。
環境設定 ([0]): 必要なライブラリのインストール(NumPy、Pandas、pulp)が行われます。
データ設定 ([1]): 外部から提供された栄養データが含まれたCSVファイル(menu2.csv)が読み込まれ、Pandas DataFrameに変換されます。
目的関数 ([2]): 選択された料理のカロリー合計を最大化することが目的です。
制約条件 ([3]): カロリー、タンパク質、脂質、炭水化物の摂取範囲が制約条件として設定されます。
最適化実施 ([4]): pulpを使用して目的関数を最大化し、制約条件の下で最適な料理の選択を行います。
結果出力 ([5]): 最適化された献立の結果が表示されます。
Google Colaboratory(通称Colab)は、Googleが提供するクラウドベースのJupyterノートブック環境で動作するようにしてあります。
自社環境に合う形で使ってください。
内容表示まで
# **********************
# [0] 環境設定 *********
# **********************
!pip install numpy
!pip install pandas
!pip install pulp
import numpy as np, pandas as pd
from pulp import *
# **********************
# [1] データ設定 *******
# **********************
#注:個人のGITHUB環境です
df = pd.read_csv('https://miraimeisatu.github.io/covid19_2021/menu2.csv')
# データ内容確認
print(df)
#実際の処理はここから
# **********************
# [2] 目的関数 *********
# **********************
# 同じ料理を最低0個・最高2個選択する
df["個数"] = LpVariable.dicts("個数",df["料理名"], 0,2, cat='Integer').values()
# 条件の範囲内でなるべく多くの食事を摂りたい
problem = LpProblem(sense=LpMaximize)
problem.setObjective(lpDot(df["カロリー"], df["個数"]))
# **********************
# [3] 制約条件 *********
# **********************
# PFCバランスを設定
problem += lpDot(df["カロリー"], df["個数"]) <= 2500
problem += lpDot(df["タンパク質"], df["個数"]) >= 120
problem += lpDot(df["タンパク質"], df["個数"]) <= 140
problem += lpDot(df["脂質"], df["個数"]) <= 80
problem += lpDot(df["炭水化物"], df["個数"]) >= 250
problem += lpDot(df["炭水化物"], df["個数"]) <= 350
problem.solve()
# **********************
# [4] 最適化実施 *******
# **********************
total_protein = sum([df["タンパク質"][i] * value(df["個数"][i]) for i in range(len(df))])
total_fat = sum([df["脂質"][i] * value(df["個数"][i]) for i in range(len(df))])
total_carbo = sum([df["炭水化物"][i] * value(df["個数"][i]) for i in range(len(df))])
total_calories = value(problem.objective)
selected_menu = [f'{df["料理名"][i]}: {value(df["個数"][i])}' for i in range(len(df)) if value(df["個数"][i]) >= 1]
# **********************
# [5] 結果出力 *********
# **********************
print(f"=カロリー,g数 =")
print(f"摂取カロリー: {total_calories}")
print(f"タンパク質: {total_protein}, 脂質: {total_fat}, 炭水化物: {total_carbo}")
print(f"=料理名, 料理数=")
for m in selected_menu:
print(m)
Colabについてわかりやすく説明します。
無料で利用可能: Colabは無料で利用できます。Googleアカウントを持っていれば、ブラウザ上で簡単に利用できます。GPUやTPUも利用でき、機械学習やディープラーニングのトレーニングなどに便利です。
Jupyterノートブック形式: ColabはJupyterノートブック形式を採用しています。コードセルとテキストセルを組み合わせ、コードの実行と説明文を同じ場所で管理できます。
クラウドベース: Colabはクラウド上で動作するため、自分のマシンに環境を構築する必要がありません。また、Google Driveとの連携も容易で、ノートブックを保存し、共有することができます。
豊富なライブラリとハードウェアアクセラレーション: Colabには多くの機械学習やデータサイエンスに使用されるライブラリが事前にインストールされています。また、GPUやTPUなどのハードウェアアクセラレーションも利用可能で、大規模な計算を高速に行うことができます。
共有と協力: ノートブックはGoogle Driveに保存され、他のユーザーと共有しやすいです。また、リアルタイムで共同作業も可能です。
データの可視化と解析: Colabにはデータの可視化や解析に役立つツールが豊富に組み込まれています。例えば、MatplotlibやSeabornなどのライブラリを使ってグラフを描画することができます。
Colabは教育、研究、プロトタイピング、データ解析、機械学習のトレーニングなど、さまざまな目的に利用されています。無料で使えるため、手軽に始めることができ、Googleのクラウドリソースを利用できる点が魅力です。
追記:
機械学習と数理最適化について
https://note.com/futureforecast/n/n9b7c27b5b0b1
機械学習と数理最適化 Advent Calendar 2023 チャレンジ している理由
https://note.com/futureforecast/n/n15fd0a157dcb