見出し画像

[数理最適化]-グーグルの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します。

  1. データ設定: Googleドライブ上のCSVファイルから栄養素と食材のデータを読み込みます。

  2. 目的関数: 最小化対象の目的関数を設定します。

  3. 制約条件: 食料の金額と栄養素の関係についての制約条件を追加します。

  4. 最適化実施: 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についてわかりやすく説明します。

  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のクラウドリソースを利用できる点が魅力です。

追記:


機械学習と数理最適化について

機械学習と数理最適化 Advent Calendar 2023 チャレンジ している理由

#機械学習 , #ChatGPT , #量子コンピューター , #AI ,
#クリスマス , #アドベントカレンダー , #量子コンピューター , #数理最適化 , #量子アニーリング

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