鍋の可能性への挑戦 〜GAによるレシピ作成〜

はじめまして
2勝3敗2引き分け中のナカニシです
不束者で御座いますが以後お見知りおきを

些か稚拙ではありますが最後までお付き合い頂けると喜ばしい限りです

無限の可能性

冬、肌寒くなり無性に食べたくなるものがある。鍋である。

その起源は古く、遡ること約1万2000年前、縄文時代早期。土器の発明と共に誕生した。江戸時代には牛鍋[1]、現代ではカレー鍋や豆乳鍋など進化を遂げた。幾千もある具材や味付けの組み合わせにより多様な進化を遂げた鍋。その可能性は無限である。そんな無限の可能性を持つ鍋に挑んだ男たちがいた。エンジニアを目指す二人の学生たち。

「今までにない人類の叡智を超えた神の領域に達する鍋をつくってみせる」

出処の分からない謎のやる気がプロジェクトを後押しした。

「進化?だったらGA(遺伝的アルゴリズム)[2]を使えばいいじゃない」

しかしGAを用いた新しい鍋のレシピの作成は、想像を絶する困難の連続に見舞われる。定性的である味の数値化。初のプロトタイプ。設計にミスがあり評価がうまくいかず、出てくる値は目標値からかけ離れていた。

それでも、男たちは歩みを止めなかった。鍋の無限に広がる可能性の向こう側に向かって、ひたすら突き進んだ。

これは、鍋の可能性に挑んだ若き二人の学生の物語である。

 

[1] 牛鍋といえば文明開化、明治時代を思い出しますが起源は江戸時代です。
   [2] GAは遺伝子を持つ個体(染色体)をいくつか作り、各染色体を評価し優位な染色体(親)を交叉させ新たな染色体(子)を作る。これを何度(何世代)も行い、最適解を得るというものです。

冬の定番料理、鍋

調理の簡単さ、コスパ、大人数でも楽しめることから学生に人気である鍋。冬になると学生たちは友人宅に集まり鍋をした。鍋を食べながらその無限の可能性に気が付いた男がいた。J科 ナカニシ。その具材や味付けの幅広さにナカニシは魅せられた。当時、ナカニシはGAに関する授業を取っていた。ナカニシは思った。GAを使えば人類の叡智を超える新たな鍋が作れる。それがはじまりだった。

GAの授業、プロジェクトワークが課された。かねてからの知り合いとチームを組んだ。 I科 ウォーリー。彼もまた鍋の可能性に魅せられた男だった。無限の可能性のその先へ、二人の挑戦がはじまった。

 

味の数値化

まず、最初の難関は味であった。美味しさの定義が必要である。ナカニシはググった。理解できなかった。味という不確実なモノへのアプローチ。定性的である味。人それぞれ嗜好があり、個人差がある。二人は窮地に立った。

「人それぞれ違うのならユーザに任せれば良いのでは?」

ウォーリーは言った。ユーザが、甘さ、しょっぱさ、酸っぱさ、辛さ、苦さという味のパラメータを指定する。これを美味しさの定義とする。これなら、もしまずいものが出来てもパラメータの指定を間違えたユーザの責任に出来る。悪魔的発想。責任転嫁。ナカニシは二つ返事で賛成。最初の難関を乗り越えた。

実装&エラー

設計を終えた二人は、プロトタイプの開発に入った。プロトタイプが完成した。動作確認。ここで問題が生じる。二人は適当な値を入れて動かしてみた。うまくいかなかった。評価値は小さい[3]が、個別で見るとかけ離れている味がいくつかあった。評価の仕組みを変えなければ。ナカニシは考えた。

(自分たちはなぜGAのパラメータがおかしいと分かるんだ?自分たちと同じようにGAにも評価させないと)

GAの評価関数は単純なパラメータの差の合計で評価し、自分たちはパラメータの比で評価している。ナカニシが新たな評価関数を考え、ウォーリーが実装。再度テストした。評価値は0.5、GAが生成したレシピの味のパラメータの比はユーザが指定したパラメータの比とほぼ等しかった。

(もう完成だな)

二人に安堵の表情が浮かんだ。束の間の安堵だった。期待とは裏腹に問題が生じる。

 

[3] GAでは評価が良い個体(親)から新しい個体(子)を作る。今回はユーザ指定のパラメータと各個体のパラメータとの差を評価としているため評価値が小さいほう=ユーザが指定したパラメータに近いほうが優位になる。

越えられない0.43の壁

一通りプログラムが完成しレシピ生成に取り掛かった。美味しい鍋を作るため評価値が0.2を切るまで計算しよう。これがきっかけだった。評価値が0.2を下回れば計算を止めるようにプログラムを書き換えた。実行した。なかなか終わらない。一時間待った。世代数は二億世代を越えた。それでも値は0.43。0.2を下回る事はなかった。時間と電気代の無駄だった。目標は0.43を切ることに変わった。

(理論上0.43を切ることは難しいのでは?味のパラメータの比は近いし気にすることはないだろう)

ナカニシは思った。ふと表示される数字の羅列に目を遣った。十数個しか無いはずの遺伝子が二十個以上ある。増えるはずのない遺伝子が増えている。不可解な出来事に焦る二人。コードを見返した。原因がわかった。交叉[4]の関数。一時的にデータを格納するListのデータを消し忘れたままデータを付け加えていたのだ。交叉が正しく行われていないことに気がつく。

(正しく交叉すれば0.43を切るのでは?)

期待を胸に、コードを修正し、再度テスト。二人に緊張が走る。すぐに計算は終わった。モニタを見ると、そこには評価値0.424の文字。越えられない0.43の壁を打ち破った。


[4]交叉、ここでは一番、二番目に良い個体の前半後半の遺伝子を入れ替えて新しい個体を作成した。

レシピ生成、そして

ついにプログラムが完成した。二人は、評価値が0.06を下回れば終了となるようコードを書き換え、実行。はやる気持ちを抑え、味のパラメータ(甘さ,しょっぱさ,酸っぱさ,辛さ,苦さ)=(50,10,5,70,10)を入力、エンターキーを強く押した。計算が終わり、計算結果が出た。425,128世代、評価値0.057…、[0,0,2,…]。これが世界で初めて(であろう)GAによって鍋の味付けのレシピが生成された瞬間であった。興奮さめやらぬまま、二人は手分けしてメニューを書き留めた。

料理酒 : 2
みりん : 35
お酢 : 1
キムチ : 2
豆乳 : 47
砂糖 : 82
赤ワイン : 7
コーヒー : 10
タバスコ : 99

二人は目を疑った。タバスコ : 99。ある意味おいしい。のんきに考えていた。

(試食しなくては)

二人は謎の使命感に駆られた。ここで目が覚める。タバスコ : 99の脅威。もう一度生成し直すことを視野に入れた。ここでやり直しては世界初(かもしれない)でなくなる。二人は腹を括った。タバスコ鍋。買ったばかりのタバスコが空になっていた。部屋の中はタバスコの匂いで満たされた。

二人は同時に食べた。二人の顔からは笑みが消え去った。その辛さは二人の予想を越えていた。二人はタバスコの辛さを侮っていた。口直しに市販の鍋の素でキムチ鍋を作り、食べながら二人は笑った。

 

 

(やっぱ市販のやつは手軽やしおいしいからええな)

 

男たちの挑戦は、まだ、始まったばかりであった。

 

cookpadにてレシピを公開しました。githubのリンクも載ってます。
つくれぽお待ちしております。 https://cookpad.com/recipe/4312937