[数理最適化]-グーグルの10セントダイエットを解いてみた -
グーグルに「生存コスト」、できるだけ少ないお金で生きていけますか?最小のコストで生きていく、というお題が出ていたので解いてみました。
PuLPという、よく使われている(線形計画法の教育や研究プロジェクト、ビジネスアプリケーションなど)Pythonパッケージについてのサンプルプログラムです。
(1)はじめに
機械学習と数理最適化 Advent Calendar 2023 チャレンジ の文書です。
の下図のとおり、数理最適化の分です。
PuLP(Python LP)とは!?
線形計画(Linear Programming)問題をモデリングおよび解決するためのオープンソースの最適化ツールです。PuLPは線形計画法だけでなく、整数線形計画法(Integer Linear Programming)および混合整数線形計画法(Mixed Integer Linear Programming)などもサポートしています。
(2)想定している活用シーン
①食事管理アプリやウェブサイトに組み込む
このプログラムも利用して、栄養バランスが最適化された個々のユーザー向けの1日の献立を生成し、食事管理アプリやウェブサイト上で表示することができます。
②食事プランニングツールとして利用する
このプログラムを利用して、栄養バランスの考慮された食事プランニングツールを作成することができます。ユーザーは目標となる栄養素の範囲を設定し、プログラムが最適な献立を生成します。
(3)想定している運用
①健康管理アプリ
ユーザーは自身の身体的な状態や目標を入力し、このプログラムを利用して栄養バランスが最適化された1日の献立を生成することができます。ユーザーにとって最小コストとなる食事プランを提供します。
②レシピサイト
料理のレシピと栄養情報を持つレシピサイトでは、ユーザーが特定の栄養素やカロリーの範囲内で食事を計画するために、このプログラムを活用することができます。ユーザーが最小コストとなる食事プランを提供します。
(4)コードの概要
環境設定: NumPy, Pandas, PuLPパッケージをインストールし、必要なライブラリをimportします。
データ設定: Googleドライブ上のCSVファイルから栄養素と食材のデータを読み込みます。
目的関数: 最小化対象の目的関数を設定します。
制約条件: 食料の金額と栄養素の関係についての制約条件を追加します。
最適化実施: LpProblemを解いて最適な食事プランを計算し、結果を表示します。
(4)コード詳細説明
最適化は「PuLP」という線形プログラミングのためのライブラリを使用しています。プログラムは以下のステップに分かれています。
データ設定
dffoods: 食材の栄養素データが含まれるDataFrame。
dfnutrient_lowerlimit: 各栄養素の下限値が含まれるDataFrame。
2. 目的関数
problem: LpProblemオブジェクトを生成し、最小化対象の目的関数を設定します。
3. 制約条件
food_amount: 食材ごとの金額を表す変数を作成します。
制約条件では、各栄養素の下限値が満たされるように制約を追加しています。
4. 最適化実施
problem.solve(): 最適化問題を解きます。
その後、最適な食事プランと週間コストを計算して表示します。
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環境です
# 元データはグーグルです
#当該食料の150円=1ドル あたりの栄養素
dffoods = pd.read_csv("https://miraimeisatu.github.io/covid19_2021/food2.csv")
#1食最低限どのくらいの栄養素が必要か
dfnutrient_lowerlimit = pd.read_csv("https://miraimeisatu.github.io/covid19_2021/nutrient.csv")
#データ表示
#print(dffoods)
#print(dfnutrient_lowerlimit)
#前5行だけ表示
print("150円当たり:前5行だけ表示")
print(dffoods.head())
print("1食当たり 必要各栄養素:前5行だけ表示")
print(dfnutrient_lowerlimit.head())
#実際の処理はここから
# **********************
# [2] 目的関数 *********
# **********************
# 最小化:LpMinimize を使います
problem = LpProblem('Stiger Diet', LpMinimize)
# **********************
# [3] 制約条件 *********
# **********************
# food_amount、食料xに何円使うか?という変数のリスト
food_amount = [LpVariable('food_{0}'.format(i), lowBound=0) for i in range(len(dffoods))]
# food_amountはその食料に何円使うか?の変数なので、単純に和をとれば食料費の総額
problem += lpSum(food_amount)
#それぞれの栄養素の下限値を、購入した食料の栄養合計が上回るように設定
for k,v in dfnutrient_lowerlimit.iterrows():
problem += lpDot(food_amount, dffoods[v.Nutrient]) >= v.Intake
# **********************
# [4] 最適化実施 *******
# **********************
problem.solve()
# 最適化の状態を確認
print("1食当たり:", LpStatus[problem.status])
# 週間コストを算出するため、最適値に7日 を乗じてます。
annual_cost = 0
for i, fa in enumerate(food_amount):
if value(fa) > 0:
# 小数点以下1位で切り上げ
cost_per_week = round(value(fa) * 150, 1)
print("{0} : ¥{1}".format(dffoods.food[i], cost_per_week))
annual_cost += 7 * 3 * cost_per_week
# **********************
# [5] 結果出力 *********
# **********************
# 小数点以下1位で切り上げ
print("上記がコスト最小となる最適な食材の組み合わせで、週間{0}円で済みます".format(round(annual_cost,1)))
Colabについてわかりやすく説明します。
無料で利用可能: Colabは無料で利用できます。Googleアカウントを持っていれば、ブラウザ上で簡単に利用できます。GPUやTPUも利用でき、機械学習やディープラーニングのトレーニングなどに便利です。
Jupyterノートブック形式: ColabはJupyterノートブック形式を採用しています。コードセルとテキストセルを組み合わせ、コードの実行と説明文を同じ場所で管理できます。
クラウドベース: Colabはクラウド上で動作するため、自分のマシンに環境を構築する必要がありません。また、Google Driveとの連携も容易で、ノートブックを保存し、共有することができます。
豊富なライブラリとハードウェアアクセラレーション: Colabには多くの機械学習やデータサイエンスに使用されるライブラリが事前にインストールされています。また、GPUやTPUなどのハードウェアアクセラレーションも利用可能で、大規模な計算を高速に行うことができます。
共有と協力: ノートブックはGoogle Driveに保存され、他のユーザーと共有しやすいです。また、リアルタイムで共同作業も可能です。
データの可視化と解析: Colabにはデータの可視化や解析に役立つツールが豊富に組み込まれています。例えば、MatplotlibやSeabornなどのライブラリを使ってグラフを描画することができます。
Colabは教育、研究、プロトタイピング、データ解析、機械学習のトレーニングなど、さまざまな目的に利用されています。無料で使えるため、手軽に始めることができ、Googleのクラウドリソースを利用できる点が魅力です。
追記:
機械学習と数理最適化について
機械学習と数理最適化 Advent Calendar 2023 チャレンジ している理由
#機械学習 , #ChatGPT , #量子コンピューター , #AI ,
#クリスマス , #アドベントカレンダー , #量子コンピューター , #数理最適化 , #量子アニーリング