敵に塩を送らない
前回はケチャップ48個と塩分過多な結果となりました。原因は人類には塩が必要であることをコンピューターが忖度したためです(違うかも)。たしかに塩はシェイクスピアにも出てくるぐらい人類にかかせない調味料です。リア王にこんなセリフがあります。「As fresh meat loves salt.」。私は英語はよくわからんのですが、要は「リア充は塩が好き」ということなんでしょう(違うかも)。しかし私はリア充ではないので、塩分は控えめにしたいところです。そこで、今回は塩分制限をかけることにします。
三大栄養素に上限と下限を設ける
食塩相当量の上限を6.0gとして、ついでにたんぱく質、脂質、炭水化物にも上限と下限を設定します。数値の出典はおなじみの厚労省の資料です。そしてサイドサラダは引き続き禁止にします。赤字が前回からの変更点です。
栄養素 | 下限 | 上限 |
---|---|---|
カロリー (kcal) | 2,700 | |
たんぱく質 (g) | 88 | 135 |
脂質 (g) | 75 | 90 |
炭水化物 (g) | 337.5 | 438.75 |
ナトリウム (mg) | 2,300 | |
カリウム (mg) | 3,000 | |
カルシウム (mg) | 738 | |
リン (mg) | 600 | |
鉄 (mg) | 6.3 | |
ビタミンA (μg) | 625 | |
ビタミンB1 (mg) | 1.4 | |
ビタミンB2 (mg) | 1.6 | |
ナイアシン (mg) | 15 | |
ビタミンC (mg) | 100 | |
コレステロール (mg) | 0 | |
食物繊維 (g) | 21 | |
食塩相当量 (g) | 6.0 |
目的は前々回、前回と同じく一日必要な栄養素を満たす最もカロリーの低い商品の組み合わせとします。
コードは前回から以下を変更しました。
problem += 174*AA+ 213*AB+ 239*AC+ 192*AD+ 195*AE+ 157*AF+ 169*AG+ 139*AH+ 403*AI+ 197*AJ+ 225*AK+ 177*AL+ 303*AM+ 14*AN+ 139*AO+ 166*AP+ 115*AQ+ 169*AR+ 118*AS+ 153*AT+ 128*AU+ 134*AV+ 183*AW+ 104*AX+ 8*AY+ 397*AZ+ 254*BA+ 217*BB+ 137*BC+ 125*BD+ 136*BE+ 143*BF+ 41*BG+ 143*BH+ 133*BI+ 197*BJ+ 165*BK+ 229*BL+ 1*BM+ 253*BN+ 309*BO+ 234*BP+ 203*BQ+ 253*BR+ 281*BS+ 233*BT+ 197*BU+ 237*BV+ 152*BW+ 211*BX+ 186*BY+ 277*BZ+ 138*CA+ 285*CB+ 195*CC+ 170*CD+ 200*CE+ 223*CF+ 215*CG+ 186*CH+ 197*CI+ 80*CJ+ 8*CK+ 74*CL+ 20*CM+ 65*CN+ 340*CO+ 96*CP+ 2*CQ+ 96*CR+ 2*CS+ 94*CT+ 109*CU+ 96*CV+ 300*CW+ 100*CX+ 19*CY+ 51*CZ+ 20*DA+ 56*DB+ 76*DC+ 81*DD+ 370*DE+ 640*DF+ 20*DG+ 170*DH+ 135*DI+ 74*DJ+ 141*DK+ 163*DL+ 70*DM+ 141*DN+ 131*DO+ 121*DP+ 19*DQ+ 20*DR >= 2700
problem += 12.5*AA+ 14.5*AB+ 19*AC+ 16.7*AD+ 20.2*AE+ 15.5*AF+ 22.3*AG+ 19.2*AH+ 61.9*AI+ 19.9*AJ+ 26.5*AK+ 27.3*AL+ 39.5*AM+ 0*AN+ 14.2*AO+ 21.5*AP+ 15*AQ+ 26.5*AR+ 15.8*AS+ 17.1*AT+ 14*AU+ 15.2*AV+ 20*AW+ 12.8*AX+ 0*AY+ 34.1*AZ+ 26.2*BA+ 26*BB+ 14.4*BC+ 15.9*BD+ 17.7*BE+ 8*BF+ 0*BG+ 17.2*BH+ 10.4*BI+ 20.3*BJ+ 15.7*BK+ 29.7*BL+ 0*BM+ 19.4*BN+ 35.3*BO+ 25.8*BP+ 30*BQ+ 33.3*BR+ 39.8*BS+ 40.6*BT+ 23.2*BU+ 42*BV+ 23.5*BW+ 26.1*BX+ 23*BY+ 34.8*BZ+ 20.6*CA+ 41.4*CB+ 22.7*CC+ 25.5*CD+ 27.2*CE+ 39*CF+ 26.7*CG+ 21.4*CH+ 32.4*CI+ 5.2*CJ+ 0.2*CK+ 3*CL+ 0.4*CM+ 0.5*CN+ 13.4*CO+ 15.3*CP+ 0.5*CQ+ 15*CR+ 0.2*CS+ 14.8*CT+ 5*CU+ 3.8*CV+ 47.3*CW+ 15.8*CX+ 0.3*CY+ 1.2*CZ+ 0.2*DA+ 3.8*DB+ 3.7*DC+ 1.9*DD+ 38.2*DE+ 60.6*DF+ 0.4*DG+ 6.7*DH+ 5.3*DI+ 2.9*DJ+ 5.9*DK+ 8*DL+ 3.2*DM+ 5.4*DN+ 5.9*DO+ 5.3*DP+ 0.4*DQ+ 0.4*DR >= 88
problem += 12.5*AA+ 14.5*AB+ 19*AC+ 16.7*AD+ 20.2*AE+ 15.5*AF+ 22.3*AG+ 19.2*AH+ 61.9*AI+ 19.9*AJ+ 26.5*AK+ 27.3*AL+ 39.5*AM+ 0*AN+ 14.2*AO+ 21.5*AP+ 15*AQ+ 26.5*AR+ 15.8*AS+ 17.1*AT+ 14*AU+ 15.2*AV+ 20*AW+ 12.8*AX+ 0*AY+ 34.1*AZ+ 26.2*BA+ 26*BB+ 14.4*BC+ 15.9*BD+ 17.7*BE+ 8*BF+ 0*BG+ 17.2*BH+ 10.4*BI+ 20.3*BJ+ 15.7*BK+ 29.7*BL+ 0*BM+ 19.4*BN+ 35.3*BO+ 25.8*BP+ 30*BQ+ 33.3*BR+ 39.8*BS+ 40.6*BT+ 23.2*BU+ 42*BV+ 23.5*BW+ 26.1*BX+ 23*BY+ 34.8*BZ+ 20.6*CA+ 41.4*CB+ 22.7*CC+ 25.5*CD+ 27.2*CE+ 39*CF+ 26.7*CG+ 21.4*CH+ 32.4*CI+ 5.2*CJ+ 0.2*CK+ 3*CL+ 0.4*CM+ 0.5*CN+ 13.4*CO+ 15.3*CP+ 0.5*CQ+ 15*CR+ 0.2*CS+ 14.8*CT+ 5*CU+ 3.8*CV+ 47.3*CW+ 15.8*CX+ 0.3*CY+ 1.2*CZ+ 0.2*DA+ 3.8*DB+ 3.7*DC+ 1.9*DD+ 38.2*DE+ 60.6*DF+ 0.4*DG+ 6.7*DH+ 5.3*DI+ 2.9*DJ+ 5.9*DK+ 8*DL+ 3.2*DM+ 5.4*DN+ 5.9*DO+ 5.3*DP+ 0.4*DQ+ 0.4*DR <= 135
problem += 17.4*AA+ 29.4*AB+ 21.1*AC+ 20*AD+ 23.2*AE+ 30.2*AF+ 18.9*AG+ 13.5*AH+ 65.5*AI+ 21.7*AJ+ 30.7*AK+ 26.6*AL+ 43.1*AM+ 0*AN+ 20.2*AO+ 30.6*AP+ 25.1*AQ+ 25*AR+ 13.4*AS+ 23*AT+ 15.5*AU+ 17.3*AV+ 21.9*AW+ 9.4*AX+ 6.7*AY+ 51.3*AZ+ 42.7*BA+ 28.3*BB+ 13.9*BC+ 13.3*BD+ 20.8*BE+ 8.6*BF+ 0*BG+ 23.7*BH+ 23.8*BI+ 33.2*BJ+ 18.1*BK+ 49.7*BL+ 0*BM+ 25.5*BN+ 36.1*BO+ 50*BP+ 26.5*BQ+ 34.2*BR+ 43.2*BS+ 39.1*BT+ 28.7*BU+ 40.1*BV+ 21*BW+ 31.6*BX+ 24*BY+ 34.7*BZ+ 16.9*CA+ 43.4*CB+ 18.6*CC+ 28.4*CD+ 43.5*CE+ 36.2*CF+ 23.7*CG+ 38.3*CH+ 33.1*CI+ 3*CJ+ 1.5*CK+ 18*CL+ 0*CM+ 0.1*CN+ 51.8*CO+ 13.1*CP+ 0.2*CQ+ 12.9*CR+ 0*CS+ 12.8*CT+ 18.9*CU+ 3.9*CV+ 51.6*CW+ 17.2*CX+ 11.2*CY+ 9.6*CZ+ 0.1*DA+ 4.4*DB+ 18.1*DC+ 10.7*DD+ 60.3*DE+ 103.4*DF+ 2.3*DG+ 25.9*DH+ 20.6*DI+ 11.3*DJ+ 7*DK+ 10.6*DL+ 0.8*DM+ 5.5*DN+ 10.7*DO+ 5.5*DP+ 10.9*DQ+ 0*DR >= 60
problem += 17.4*AA+ 29.4*AB+ 21.1*AC+ 20*AD+ 23.2*AE+ 30.2*AF+ 18.9*AG+ 13.5*AH+ 65.5*AI+ 21.7*AJ+ 30.7*AK+ 26.6*AL+ 43.1*AM+ 0*AN+ 20.2*AO+ 30.6*AP+ 25.1*AQ+ 25*AR+ 13.4*AS+ 23*AT+ 15.5*AU+ 17.3*AV+ 21.9*AW+ 9.4*AX+ 6.7*AY+ 51.3*AZ+ 42.7*BA+ 28.3*BB+ 13.9*BC+ 13.3*BD+ 20.8*BE+ 8.6*BF+ 0*BG+ 23.7*BH+ 23.8*BI+ 33.2*BJ+ 18.1*BK+ 49.7*BL+ 0*BM+ 25.5*BN+ 36.1*BO+ 50*BP+ 26.5*BQ+ 34.2*BR+ 43.2*BS+ 39.1*BT+ 28.7*BU+ 40.1*BV+ 21*BW+ 31.6*BX+ 24*BY+ 34.7*BZ+ 16.9*CA+ 43.4*CB+ 18.6*CC+ 28.4*CD+ 43.5*CE+ 36.2*CF+ 23.7*CG+ 38.3*CH+ 33.1*CI+ 3*CJ+ 1.5*CK+ 18*CL+ 0*CM+ 0.1*CN+ 51.8*CO+ 13.1*CP+ 0.2*CQ+ 12.9*CR+ 0*CS+ 12.8*CT+ 18.9*CU+ 3.9*CV+ 51.6*CW+ 17.2*CX+ 11.2*CY+ 9.6*CZ+ 0.1*DA+ 4.4*DB+ 18.1*DC+ 10.7*DD+ 60.3*DE+ 103.4*DF+ 2.3*DG+ 25.9*DH+ 20.6*DI+ 11.3*DJ+ 7*DK+ 10.6*DL+ 0.8*DM+ 5.5*DN+ 10.7*DO+ 5.5*DP+ 10.9*DQ+ 0*DR <= 90
problem += 47.7*AA+ 55.8*AB+ 66.6*AC+ 48.4*AD+ 52.4*AE+ 36.4*AF+ 31*AG+ 27.1*AH+ 57.5*AI+ 38.9*AJ+ 36.8*AK+ 35.5*AL+ 57.5*AM+ 9.5*AN+ 38.1*AO+ 27.3*AP+ 27.2*AQ+ 31.4*AR+ 30.8*AS+ 39.2*AT+ 37.7*AU+ 37*AV+ 47.3*AW+ 30.3*AX+ 0*AY+ 92.9*AZ+ 40.2*BA+ 41.8*BB+ 35.8*BC+ 26.4*BD+ 29.1*BE+ 52.7*BF+ 30.2*BG+ 34.3*BH+ 41.9*BI+ 42.4*BJ+ 42.4*BK+ 31.2*BL+ 0.1*BM+ 62.8*BN+ 76*BO+ 44.1*BP+ 31*BQ+ 38.9*BR+ 36.8*BS+ 35.5*BT+ 48*BU+ 31.4*BV+ 30.8*BW+ 49.1*BX+ 47.6*BY+ 64.4*BZ+ 30.3*CA+ 41.8*CB+ 45*CC+ 29.1*CD+ 35.5*CE+ 36.3*CF+ 38.2*CG+ 37.6*CH+ 32.7*CI+ 9.6*CJ+ 4.3*CK+ 28.3*CL+ 5.6*CM+ 2.3*CN+ 128.5*CO+ 18.2*CP+ 1.1*CQ+ 18.3*CR+ 1.2*CS+ 17.2*CT+ 21.1*CU+ 24.7*CV+ 39.2*CW+ 13.1*CX+ 1.6*CY+ 13.3*CZ+ 7.7*DA+ 26.4*DB+ 31.5*DC+ 26.8*DD+ 90.4*DE+ 167.7*DF+ 5.2*DG+ 64.3*DH+ 51*DI+ 28*DJ+ 37.7*DK+ 53.4*DL+ 9.7*DM+ 46.8*DN+ 44.1*DO+ 40.6*DP+ 2*DQ+ 1.2*DR >= 337.5
problem += 2.3*AA+ 2.5*AB+ 3.3*AC+ 2.5*AD+ 3.1*AE+ 2.1*AF+ 2.1*AG+ 1.6*AH+ 6*AI+ 2.1*AJ+ 2.7*AK+ 2.9*AL+ 4.4*AM+ 0*AN+ 2.5*AO+ 2*AP+ 1.8*AQ+ 2.9*AR+ 1.9*AS+ 2.7*AT+ 2.2*AU+ 2.1*AV+ 2.9*AW+ 1.4*AX+ 0.1*AY+ 4.2*AZ+ 2.4*BA+ 2.6*BB+ 1.6*BC+ 1.6*BD+ 2.1*BE+ 1.8*BF+ 0*BG+ 2.3*BH+ 2.5*BI+ 3*BJ+ 2.6*BK+ 3.4*BL+ 0.6*BM+ 3.3*BN+ 5.3*BO+ 3.3*BP+ 2.4*BQ+ 2.5*BR+ 3.1*BS+ 3.3*BT+ 3.8*BU+ 3.6*BV+ 2.3*BW+ 4*BX+ 3.4*BY+ 4.5*BZ+ 1.8*CA+ 3.3*CB+ 2.1*CC+ 2.5*CD+ 2.9*CE+ 3.6*CF+ 3.4*CG+ 3.2*CH+ 3*CI+ 0.2*CJ+ 0*CK+ 0.6*CL+ 0.5*CM+ 0*CN+ 2.1*CO+ 2*CP+ 0.4*CQ+ 1.9*CR+ 0.2*CS+ 1.6*CT+ 0.1*CU+ 0.2*CV+ 3.9*CW+ 1.3*CX+ 0.7*CY+ 0.8*CZ+ 0.5*DA+ 0.8*DB+ 0.4*DC+ 0.6*DD+ 3.6*DE+ 6*DF+ 0.5*DG+ 1.1*DH+ 0.8*DI+ 0.5*DJ+ 0.4*DK+ 0.7*DL+ 0.1*DM+ 0.3*DN+ 0.3*DO+ 0.3*DP+ 0.6*DQ+ 1*DR <= 6
結果
条件を満たす組み合わせはちゃんとあるでしょうか。今回は三大栄養素の許容範囲が狭いので、ちゃんと出るか不安です。実行!
最適な組み合わせは今回も存在するようです。わずか0.61秒で計算完了。最新のM1 Macもびっくりだぜ!(マクドナルド的な意味で)
今回の商品の種類は6種類。以下がその組み合わせです。
バターパット(3個)
味はバターで決まるという言葉を真摯に受け止め、最初に直食いすることで速攻でキメます。
りんご&クリーム(1個)
ケチャップ(1個)
えだまめコーン(8個)
全く塩気がないので、塩分が気になるお年頃の方にもオススメです。
ヨーグルト(27個)
来ましたメインディッシュ。コンピューターが悩みぬいた結果の一手はヨーグルトでした。
そして、最後の一品は、なんと・・・・!
マックフライポテト(M)(1個)
なんということでしょう!この企画で初めてマクドナルドっぽい食べ物が出てきました!ああ、コンピューター様、お優しい・・・たった1つだけだけど。
この組み合わせによって以下の通り一日に必要な栄養素を満たす極めて健康的な栄養を摂取することができます。塩分も5.9gと理想的!
栄養素 | 摂取量 |
---|---|
エネルギー(kcal) | 2,901 |
たんぱく質 (g) | 133.9 |
脂質 (g) | 87.8 |
炭水化物 (g) | 400 |
ナトリウム (mg) | 2,320 |
カリウム (mg) | 5,841 |
カルシウム (mg) | 2,648 |
リン (mg) | 2,746 |
鉄 (mg) | 9.9 |
ビタミンA (μg) | 633 |
ビタミンB1 (mg) | 1.9 |
ビタミンB2 (mg) | 4.0 |
ナイアシン (mg) | 16.0 |
ビタミンC (mg) | 104 |
コレステロール (mg) | 171 |
食物繊維 (g) | 31.1 |
食塩相当量 (g) | 5.9 |
バターパット: 3.0
えだまめコーン: 8.0
りんご&クリーム: 1.0
ケチャップ: 1.0
マックフライポテト(M): 1.0
ヨーグルト: 27.0
究極のメニュー降臨
いかがでしたか?**「朝昼晩の三食ともひたすらヨーグルトを計1.9kg食べなさい、さすればおやつにポテトが与えられるだろう」・・・これは間違いなく天の啓示です!**仏陀も「自分で自分を励ましてあげなさい」と言っているのでこのアメとムチ路線は天のお墨付きです!この努力と願いは必ずや生きて届くことでしょう。天にではなく腸に。
(2021/8/10追記)
じゃあ野菜だけで組み合わせを考えたらどうなるんだ?という疑問はこちらで解きました。
野菜だけで一日分の栄養を取れる組み合わせを計算したら衝撃の結果が!
参考リンク
元記事:https://www.transrecog.com/diary/2021/04/01/post-1521/(プログラミングを主題とするように著者自身がQiita向けに加筆)
前々回:マクドナルドで一日分の栄養を取れる組み合わせを計算したら衝撃の結果が!
前回:続・マクドナルドで一日分の栄養を取れる組み合わせを計算したらさらに衝撃の結果に
(補足1)目的関数
目的関数は総費用最小化にするという手もありますが、マクドナルドはクーポンを配りまくっているので現実的な解は望めないと思いやめました。また、同じ商品ばかり選ばれるのを避けるには個数制限をかけるという手がありますが、それよりもどうせやるなら似たような栄養素の商品の組み合わせを避ける条件にしたほうが良いと思います。栄養素は17種類なので、各商品の栄養素を正規化した17次元の頂点を含む凸包の最大化、とか良いかもしれません。
(補足2)この企画の目的
この企画の目的は、一見無味乾燥に見える数式やデータにもドラマがあることを伝えることでした。ちょっとでも数理最適化に興味を持っていただければ幸いです。