Upgrade to Pro — share decks privately, control downloads, hide ads and more …

おやつは300円まで!の最適化を模索してみた

 おやつは300円まで!の最適化を模索してみた

2つの解法, 2つの言語でおやつ選びを最適化してみました。
小学生の頃に誰もが経験したことがあるであろう「おやつは300円まで!」
実はとても難しい問題なのです。一般的なノートPCで計算すると、7万年以上の時間がかかってしまいます。そのような大変な問題に対してどのように立ち向かうのか?貪欲解法と厳密解法で解を比較し、PythonとC#で計算時間も比較してみました。

Avatar for PERSOL CAREER Dev | techtekt

PERSOL CAREER Dev | techtekt PRO

September 03, 2025
Tweet

More Decks by PERSOL CAREER Dev | techtekt

Other Decks in Technology

Transcript

  1. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 2

    会社紹介(自己紹介) 01 はじめに 02 おやつは300円まで! 03 組み合わせ最適化と応用例の紹介 04 試してみた解法 05 最後に 06
  2. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 4

    小澤 陽介 Yosuke Kozawa リードデータアナリスト パーソルキャリア株式会社 経歴 前職では機械系メーカーR&Dにて数理最適化の アプリケーション開発及び工程可視化に従事。 パーソルキャリア入社後、アナリストとして、 主に生成系AIに関連するアプリケーション開発 や検証に従事。現在はグループ企業向けのML推 薦システム構築に携わっている。 出身:福岡(ラーメンは豚骨) 趣味 数式いじり(解析学), プログラミング 最適化アプリケーション開発 歌, お料理など PROFILE
  3. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 社

    名 本 社 創 業 資 本 金 事 業 内 容 従 業 員 数 5 パーソルキャリア株式会社 東京都港区 1989年6月 1,127百万円 人材紹介サービス、求人メディアの運営、 転職・就職支援、採用・経営支援、 副業・兼業・フリーランス支援サービスの提供 7,048名 (有期社員含む グループ会社出向中の者は除く 2025年3月1日時点)
  4. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 8

    おやつは300円まで!を組み合わせ最適化に落とし込んでみました ついでに2種類の言語で計算スピードを比較してみました 楽しんでもらえたら幸いです はじめに
  5. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 10

    • 遠足に行く子どものおやつを選ぶ • おやつは合計で300円までしか選べない • 出来るだけ合計のカロリーが高くなるようにしたい おやつは300円まで!
  6. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 11

    オススメ一覧より一部抜粋 全部で50種類のお菓子をピックアップしている これらのお菓子から • 300円以内になる • カロリーが最大になる 組み合わせを選んでいく お菓子の種類について 駄菓子 お値段[円] カロリー[kcal] ポテトフライ 30 62 うまい棒 12 43 キャベツ太郎 30 81 ベビースターラーメン 33 105 餅太郎 10 32 ビスコ 43 108 チョコバー 60 185 チロルチョコ 23 58 ハイエイトチョコレート 50 63 プチプチ占いチョコ 30 34 ブラックサンダー 35 112 チョコボール 92 162 パインアメ 155 18.7 棒付き水飴 60 123 コンペイトウ 460 190 ボンタンアメ 120 341 キュービィロップ 162 63 餅飴 35 42.2 森永ミルクキャラメル 146 21
  7. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 12

    • 0は購入しない, 1は購入する • “101”なら, ポテトフライとキャベツ太郎を購入す るという意味 • 3種類だと, 全部足しても72円(300円以内) • 全部買うのが最適 組み合わせを1つ1つ調べると?3種類で考えてみる 組合せ ポテトフライ うまい棒 キャベツ太郎 合計 1 0 0 0 0kcal/0円 2 0 0 1 81kcal/30円 3 0 1 0 43kcal/12円 4 0 1 1 124kcal/42円 5 1 0 0 62kcal/30円 6 1 0 1 143kcal/60円 7 1 1 0 105kcal/42円 8 1 1 1 186kcal/72円
  8. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 13

    組み合わせを1つ1つ調べると?50種類で考えてみる 組み合せ ポテトフライ うまい棒 ... ウメトラ兄弟 合計cal/値段 1 0 0 ... 0 0/0 2 1 0 ... 0 62/30 3 0 1 ... 0 43/12 4 1 1 ... 0 105/42 ... ... ... ... ... ... 250 = 1125899906842620 (1125京8999億 684万2620) 1 1 ... 1 4637.1/3737
  9. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 14

    • 組み合わせは2^50≅10^15.05通り • ノートPCの計算能力は, 1秒あたり500回程度 • 計算時間は, ざっくり10^15.05÷500=2.55×10^12秒程度 • 年に直すと, ざっくり7万1404年程度... • 実は, 解くのがとても難しい,組合せ最適化問題である. おやつは300円まで!は難しい問題
  10. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 15

    もし, 組み合わせ最適化の効率的な解法を知らなかったら...
  11. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 16

    お母さん! 300円以内でカロリー が最大になるように お菓子買って! 7万年くらい かかるから 諦めてね
  12. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 17

    ...と, 言うわけにもいかないので, 効率的な解法を試してみます
  13. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 19

    • 大きく分けて, 2種類の方法がある 近似解法 厳密解法 おやつは300円まで!を2種類の方法で解いてみる 解法:どのような手法が用いられているのか?
  14. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 20

    • 貪欲法の考え方 問題の要素ごとに評価値を与える 評価値が高い順で取り込むこと 解を得る • 貪欲法のメリット/デメリット メリット 実装が簡単 多くの問題で多項式時間で終わる デメリット 問題によっては厳密解が得られない 近似解法: 貪欲法
  15. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 21

    • コスパを求める • コスパ順でソートする • コスパが高い駄菓子を選ぶ • ナップサックに入れても300円を超えないならナッ プサックに入れる • 全ての駄菓子をチェックし終わったら終了 近似解法: 貪欲法
  16. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 22

    チョコバーまでは順番に加えていってOK(207円) 近似解法: 貪欲法
  17. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 23

    ミレービスケットは高いのでスキップ(391円になる) 近似解法: 貪欲法
  18. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 24

    きびだんごは加えてOK(257円) 近似解法: 貪欲法
  19. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 25

    ボンタンアメとたべっ子どうぶつはスキップ 近似解法: 貪欲法
  20. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 26

    キャベツ太郎は追加してOK(287円) 近似解法: 貪欲法
  21. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 27

    チロルチョコからビッグカツはスキップ 近似解法: 貪欲法
  22. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 28

    どんぐりガムは追加してOK(298円) それ以降はスキップ 2円以下のお菓子が存在しない... 近似解法: 貪欲法
  23. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 29

    近似解法: 貪欲法の答え 名前 値段[円] カロリー[kcal] ヤングドーナツ 47 195 クッピーラムネ 10 39 うまい棒 12 43 餅太郎 10 32 ブラックサンダー 35 112 ベビースターラーメン 33 105 チョコバー 60 185 きびだんご 50 145 キャベツ太郎 30 81 どんぐりガム 11 20.7 合計 298 957.7
  24. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 30

    • 整数計画法の考え方  「〇〇を買う or 買わない」を「1 or 0」で置き換える  制約と最大化(or 最小化)する式をあてはめる • 数理最適化のメリット/デメリット • メリット 厳密に最適解が得られる • デメリット 数理最適化, 特有のソルバによるプログラミングのドメイン知識が必要であるため 実装のハードルが若干高い 計算時間が長くなる可能性がある 厳密解法: 整数計画法
  25. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 31

    • 実用的には数理最適化ソルバを使用した方が良い(実装力に自信があるなら話は別) • 実用なソルバは何種類かあるが, 個人的にOR-Toolsがお勧め 厳密解法: 整数計画法
  26. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 32

    • 要求を整理して、 厳密解法: 整数計画法
  27. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 33

    • 定数、変数を定義して、 厳密解法: 整数計画法
  28. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 34

    • 制約式、目的関数を定義して、 厳密解法: 整数計画法
  29. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 35

    • コーディングして、 厳密解法: 整数計画法
  30. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 36

    厳密解法の答え 名前 値段[円] カロリー[kcal] うまい棒 12 43 ベビースターラーメン 33 105 餅太郎 10 32 ビスコ 43 108 チョコバー 60 185 ブラックサンダー 35 112 クッピーラムネ 10 39 ヤングドーナツ 47 195 きびだんご 50 145 合計 300 964
  31. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 37

    近似解法と厳密解法の比較: 解の品質について 名前 値段[円] カロリー[kcal] 名前 値段[円] カロリー[kcal] うまい棒 12 43 うまい棒 12 43 きびだんご 50 145 きびだんご 50 145 キャベツ太郎 30 81 クッピーラムネ 10 39 クッピーラムネ 10 39 チョコバー 60 185 チョコバー 60 185 どんぐりガム 11 20.7 ビスコ 43 108 ブラックサンダー 35 112 ブラックサンダー 35 112 ベビースターラーメン 33 105 ベビースターラーメン 33 105 ヤングドーナツ 47 195 ヤングドーナツ 47 195 餅太郎 10 32 餅太郎 10 32 合計 298 957.7 合計 300 964 0-1整数計画法 貪欲法 • 解の品質は, やはり厳密解法の方が良い • しかし, 良いと言っても0.7%程度
  32. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 38

    • 貪欲法 概ねC#の方が早い 純粋に言語の速度が出ている • 整数計画法 概ね同じくらい いずれの言語でもOR-Toolsを呼び出しているだけなので, 速度はほとんど変わりない 近似解法と厳密解法の比較: 速度について
  33. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 39

    • 実用的には, そこそこの解(近似解)で充分であることが多い • 問題サイズによっては, 厳密解法でもさほど時間が掛からない場合も多い • ケースバイケースで言語, 手法等を使い分けるのが望ましい 近似解法と厳密解法の比較まとめ 近似解法 厳密解法 計算速度 速い 遅い 最適性 最適解とは限らない 最適解である 使いどころ そこそこの品質の解が 欲しい時 問題のサイズが充分に小さ い時 今回の例での解 957.7kcal 964kcal
  34. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 41

    • 今回は駄菓子選びを組み合わせ最適化に落とし込み, 解法の比較についてお話しました. • 他にも解法はあるかと思いますが, 代表的で分かりやすい解法を選んできたつもりです. • 最適化, ちょっと面白いかも?と思ってもらえたら幸いです. • 最後ですが, お子様に同じ問題を持ち込まれた際には, お子様の好きな順番でお菓子を買っ てあげて下さい. 最後に
  35. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 43

    • OR-Tools • Googleが開発している無料ソルバ • 商用利用可, コードの開示義務ナシ • 対応言語が多い(C++, Python, Java, C#(.NET)) • 無料ソルバにしては結構早い • PuLP • Python専用の数理最適化モデリング言語 • COINというソルバが同梱されており, 普段はCOINを使う • GLPK, CPLEX, GUROBI等の商用ソルバとの連携が可能 • COINだけだとちょっと遅いかも... Appendix:数理最適化の求解ツールについて
  36. Copyright © PERSOL CAREER CO., LTD. All Rights Reserved. 44

    さまざまなテーマで事例や知見を学ぶ IT・テクノロジー人材のための勉強会コミュニティ 「TECH Street」でも当社の事例を公開しています。 「techtekt(テックテクト)」は、パーソルキャリアのエンジニアブログです。 “みんなの「はたらく」をテックでつくる”をコンセプトに、 技術、組織、学びなど、さまざまな情報を発信しています。