ぼくの名前はタカシ。こう見えても自称ヒーローって呼ばれてるんだ!
今日も困っている人を救う旅に出るぞ~!!!
そして、助手のリサ。サポートお願いね!

(あれ…数学教えてくれるっていうからついてきただけなんだけどな…?)

ほら、あそこの駄菓子屋さんに困ってるLadyがいるよ。

さっきからちょいちょいツッコミどころあるよね?

行ってみよう!Let's Hero!

私代わりに英語教えてあげようか?

そこのお嬢ちゃん、どうしたんだい?
僕らのヒーロー、お兄ちゃんが助けてあげるよ!

貴方は言動変だし、写真はサイズ感逆じゃない?

ありがとう、お兄ちゃん。

(受け入れた…!)

あのね、来週遠足があって
100円分だけおやつを持ってきていいって言われたの。でも、こんなにたくさんあるから選べなくて。
「美味しい棒」と「ブラックダンサー」が好きなんだけど、いっつも周りの子が買ってきたおやつをみると、そっち買えばよかった!って思っちゃうから
たくさんの種類で、満足できるように選びたくて。ほんとは100円超えてもいいってことも気づいてるけど、あたし世間体を気にするタイプだからそんなことできなくて。しかも、貰ったおつりはママが全部貰うっていうの、なるべくママにいい思いさせたくないんだ、どうしたらいいかな?

なるほど…赤裸々にありがとう。

それよりこの子の育った環境が気になるね?

そんな時は
「組合せ最適化」を使おう!
組合せ最適化(くみあわせさいてきか、英: combinatorial optimization、組み合わせ最適化、または組み合せ最適化とも表記される)は、応用数学や情報工学での組合せ論の最適化問題である。オペレーションズリサーチ、アルゴリズム理論、計算複雑性理論と関連していて、人工知能、数学、およびソフトウェア工学などの交差する位置にある。組合せ最適化では、厳密解が簡単に求まる場合もあれば、そうでない場合もある。厳密解を求めるのが難しいと思われる問題を解くために、その問題の解空間を探索する場合もあり、そのためのアルゴリズムでは、効率的に探索するために解空間を狭めたりすることもある。(Wikipediaより)

説明端折らないでください。

まあ端的に言うと数学の力を使って
「決められたルールの中で、一番良い組合せを見つける」ってことかな。
例えば今回だと、「100円以内」っていうルールの中で、
「満足度」が最大になるお菓子の組み合わせを探すってことだ。

まともな解説もできるんですね。

一応、高校時代数学13だったからね。

それは何段階評価なんですか?

まず、今の発言をもとに表を作ってみた結果がこれだ。
変数 |
名前 |
値段 |
満足度 |
a |
美味しい棒 |
10円 |
10点 |
b |
ブラックダンサー |
32円 |
9点 |
c |
パクチーシガレット |
27円 |
7点 |
d |
ブタメシ |
60円 |
6点 |
e |
タラタラしてるよ |
20円 |
5点 |
f |
ビッグステーキ |
30円 |
4点 |
g |
8円アメ |
8円 |
3点 |
h |
ジュニアドーナッツ |
44円 |
2点 |
i |
パクリチュウ |
35円 |
1点 |

あ、お兄ちゃん違う。美味しい棒は200点でパクリチュウは-5点。

それだと、面白い問題にならなくなっちゃうからね?

本音を出さないで。

とりあえず、この表を基にまず式を作ってみようか。
まずお菓子一つ一つに変数a~iを振り分けて、選ぶを1、選ばないを0としよう。
値段の式は合計が100以下だから、(1)10a + 32b + .... ≦ 100 が成り立てばよい。

いや、私変数って聞いただけでもう数学アレルギーが…

まあまあ落ち着いて。満足度の方の式は
(2)10a + 9b + .... を最大にしたいんだよね。
(1)10a + 32b + 27c + 60d + 20e + 30f + 8g + 44h + 35i ≦ 100
(2)10a + 9b + 7c + 6d + 5e + 4f + 3g + 2h + i = MAX
これで式が2本できたから、まず具体的に試してみようか。
例えばb,c,dを選んだとすると…?選んだ値に1、それ以外に0を代入してみて?

うーん、(1)は32+ 27 + 60 で119。(2)は9+7+6で22かな?

そうそう!でもこれだと、(1)が100円以下っていう条件に反しちゃうよね?
(1)の条件を守りつつ(2)を最大にする組み合わせをこうやって見つけていくんだ。

なるほど…ちょっと分かったかも。
ところでこの問題どうやって解くの?

うーん、手作業だと結構時間がかかっちゃうなあ…

そんな時は僕にお任せ!

まず、誰ですか?

ぼくの名前はプログラミングする太郎。面倒な計算も一瞬だよ!まずはプログラミングができる環境(今回はPython)を用意して、PULPっていうライブラリをインストールしよう。そして所定のコードを記述して、値段と満足度をここにセットすれば…

ほら、答えが一瞬で出たよ!
最大満足度:34.0 / お菓子の組み合わせ:[0, 1, 2, 4, 6]

この0,1,2っていう数字はa,b,cと対応してるから答えはa,b,c,e,gになるね。実際に計算すると、a+b+c+e+g = 10+32+27+20+8=
97 で100以下だから、正しそうだね。

プログラミングってすごいんだね!ってあれ、お嬢ちゃんは?

長すぎて帰っちゃった。
それに私も、こういう英字の羅列はちょっと苦手...

やっぱりそうか…数学やプログラミングも日常に寄り添って考えれば案外親しみやすくなるかなって思ったんだけどなあ。特に今はプログラミングも義務教育になる時代だし。国語とか英語がいい例だけど、「身近にあること」って一番の学びへの近道じゃない?

まあ、多少は面白かったかな?このプログラム?を組み込んだアプリなんかあったら、気軽に手に取りやすいんじゃない?

確かに!うーん、でも遠足のおやつはやっぱり自分で選ぶ方が楽しいのかも。

え?じゃあ意味ないじゃん?結局何が伝えたかったの?

だからこう、便利なIT技術や知識があっても状況に応じて上手な使い分けや取捨選択をすることが大事なのかなって。情報化社会が拡大しても昔からの大事なものや人間の良い部分が切り取られてしまったらそれこそ本末転倒だからね。

なるほどね、でも「これってITで便利にできないかな?」とか「ITをこういう風に取り入れたい!」って思っても私たちの判断じゃどうにもならないよね…

そんな時は、お気軽に下記まで。
↓↓↓↓↓↓↓↓