karasuex54’s blog

プログラミングよりイリヤの方が好き

生協食堂のメニューをコスパ良く選んでみた

こんにちわ、からすさんです。お題通りに生協のメニューをコスパ良く選んでみました。

じゃあまずどういうことかってことを以下にまとめてみました。

  • 1食分の食品群(赤、緑、黄)を1食でちゃんと満たす
  • 1食に2品同じものが選ばれない
  • 食品群の他にも脂質や塩分の条件をつけくわえれる

以上の3点を満たしかつ値段を最小にしてくれるコスパのいいメニューを選びましょう!

問題設定

以下のような問題を最適化問題で表していきます。

  • 1品1回まで選択可
  • 食品群(赤、緑、黄)はそれぞれ(2点、1点、5点)以上とする。(これは男版)
  • 任意の栄養も調整可

以上を踏まえて今回解いていく最適化問題は次の通りです。

f:id:karasuex54:20200313235629p:plain

f:id:karasuex54:20200314000228p:plain

これは、線形計画問題でその中でも0-1整数計画問題と呼ばれる問題です。

解き方

解き方を書こうと思ったけどPythonPuLPというフリーのソルバーがあり、これにぶっこむだけで答えが返ってきます!この手のブログは解き方がメインだけど今回は「答えが出ればいい」だからね

PuLPは次のサイトからサンプルコードやいろいろを学んできました。

qiita.com

ソースコード

今回使用したコードはgithubに置いときますね。

github.com

いくつか注意しなければならない点があります。今回使用したソルバーPuLPをインストールする際に

pip install PuLP==1.6.0

とバージョンを1.6.0で使用しています。最新のバージョンでは動きませんでしたX(

使用例

python solver.py

でsolver.pyを実行します。そこで、いくつか入力を求められるので以下の入力を参考に使ってみてください。(なお答えがでなければ「not solve」が出ます。)

次のような条件で候補を出してみます。

  • エネルギーは1kcal以上1000klca以下
  • タンパク質は2g以上2000g以下
  • 脂質は3g以上3000g以下
  • 炭水化物は4g以上4000g以下
  • 塩分は0.5g以上50g以下
  • 赤は2以上200以下
  • 緑は1以上100以下
  • 黄は5以上50以下
1 1000
2 2000
3 3000
4 4000
0.5 50
2 200
1 100
5 50

これを入力して出力されるのは

['あじフライ', '肉じゃが', '春雨サラダ(しそ風味)', '大根おろし']
352.0

となります。1行目は品のリストで2行目はその合計金額です。実際に合ってるのかを調べてみて次に示します。

f:id:karasuex54:20200314003414p:plain

上の画像より、3点群やほかの栄養素の条件、金額があってることが確認できました。

もうすぐしたら新学期です。楽しい大学ライフを送りましょう!