見出し画像

[数理最適化]-栄養バランスが最適化された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についてわかりやすく説明します。

  1. 無料で利用可能: Colabは無料で利用できます。Googleアカウントを持っていれば、ブラウザ上で簡単に利用できます。GPUやTPUも利用でき、機械学習やディープラーニングのトレーニングなどに便利です。

  2. Jupyterノートブック形式: ColabはJupyterノートブック形式を採用しています。コードセルとテキストセルを組み合わせ、コードの実行と説明文を同じ場所で管理できます。

  3. クラウドベース: Colabはクラウド上で動作するため、自分のマシンに環境を構築する必要がありません。また、Google Driveとの連携も容易で、ノートブックを保存し、共有することができます。

  4. 豊富なライブラリとハードウェアアクセラレーション: Colabには多くの機械学習やデータサイエンスに使用されるライブラリが事前にインストールされています。また、GPUやTPUなどのハードウェアアクセラレーションも利用可能で、大規模な計算を高速に行うことができます。

  5. 共有と協力: ノートブックはGoogle Driveに保存され、他のユーザーと共有しやすいです。また、リアルタイムで共同作業も可能です。

  6. データの可視化と解析: Colabにはデータの可視化や解析に役立つツールが豊富に組み込まれています。例えば、MatplotlibやSeabornなどのライブラリを使ってグラフを描画することができます。

Colabは教育、研究、プロトタイピング、データ解析、機械学習のトレーニングなど、さまざまな目的に利用されています。無料で使えるため、手軽に始めることができ、Googleのクラウドリソースを利用できる点が魅力です。

追記:


機械学習と数理最適化について
https://note.com/futureforecast/n/n9b7c27b5b0b1

機械学習と数理最適化 Advent Calendar 2023 チャレンジ している理由
https://note.com/futureforecast/n/n15fd0a157dcb

よろしければサポートよろしくお願いします。いただいたサポートは、日中韓とアメリカのリアルタイム感情分析を進めるために使わせていただきます