最強のりものヒーローズ3月号 ふろく「のりもの ひらカナかずポスター」を深さ優先探索で勝手に最適化する
のりもの ひらカナかずポスター
我が家の2歳児がお風呂に入るたびに笑って喜ぶ、素晴らしいポスターがあります
これは学研さんが出版する「最強のりものヒーローズ 3月号」の付録です。
お風呂にはれるひらがなポスターを探しているときに本屋で偶然見かけ、衝動買いしました。
ラインナップをよく見てみる
この「のりもの ひらカナかずポスター」(以下、50音ポスター)には50音のそれぞれに乗り物の名前が割り当てられています。一部「いちじていし」のように道路標識や「ふみきり」のように例外もありますが、乗り物関連で揃えたといえば十分通るでしょう。
しかしこのポスター、よくよく見てみると、「なんでこの音にこれが?」と言いたくなる項目があります。
例えば、「た」枠の「きんたろう」です。
「きんたろう」において「た」は3文字目です。「た」を代表するには、少し弱い印象です。もしかして、「た」で始まるのりものが少ないのでしょうか?
そんなことはありません。「た」枠にはタクシー、宅配車、タンクローリー、田植え機、タラップ車がいます。彼らは名曲「はたらくくるま」に出演しているクラスの実力者で、「た」枠の選手層の厚さは50音の中でも屈指です。この層を差し置き「きんたろう」を採用した選考過程には首をかしげざるを得ません。選考過程の透明化が望まれます。
「み」の枠には「ごみしゅうしゅうしゃ」が割り当てられています。
「ごみしゅうしゅうしゃ」は子供人気が非常に高い(独自調べ)くるまなので、2文字目だとしても表に入れたくなるその気持ちはよくわかります。ただ、それなら「せいそうしゃ」にして「せ:らくせきのおそれあり」と入れ替えた方がスマートではないでしょうか。空いた「み」枠にはミキサー車でも入れておけばいいと思います。
まだあります。「よ」枠は「ばくはつぶつしょりようぐうんぱんしゃ」です。
「名前が長い」「10文字目」「子供向けにしては物騒」「そもそも聞いたことがない」と、なかなか厳しいアサインです。
今頃、子供にとって親しみやすく、かつ「よ」から始まる幼稚園バスが草葉の陰で泣いてると思います。
もちろん、50音すべてを1文字目に持つのりものだけで埋めるべき、とまでは思いません。例えば、「を」と「ん」はあらゆる50音表で鬼門です。「ん:ぽんぷしゃ」や、「を:ふみきりをつうか」など当然の妥協でしょう。他にも、「る」「ぬ」など、見つけにくい音は少なからずあります。
その意味では、「ね:こうふくのまねきねこでんしゃ」は面白いです。
1文字目こそ「ね」ではありませんが、7文字目、9文字目の2箇所に「ね」を含みつつ、その個性的な名称・見た目の電車で、いいところをついていると思います。
実際、不作の「ね」枠としてよく見つけてきたと思います。
勝手に最適化する
もちろん、子供向けの書籍を多く有し、50音表の制作経験も豊富であろう学研さんがこのレベルの違和感に気づかないとは思えません。何かやんごとない事情が働いた可能性があります。
権利関係がクリアできず、「タンクローリー」が投入できなかったとか。しらんけど。
では、使う「のりもの」は変えないまま、配置だけを入れ替えて、もっと良い50音ポスターにはできないでしょうか?
例えば、「ろ:ほいーるろーだー」を「ろ→ほ」にスライドし、「ほ:ほいーるろーだー」にすれば「ほ」の価値が高まりそうです。当然、「ろ」が空くので、代わりに「し:しろばい」を「し→ろ」にスライドします。次に「し」が空くので...といった具合です。
連鎖的にスライドし、かつ破綻しないためには、うまくスライドするのりものを選ぶ必要があります。
もしかしたら、オリジナルの50音ポスターが唯一の破綻しない組み合わせの可能性もあります。試してみないことにはわかりません。
さあ、学研さんのため、全国のひらがなを覚えたいのりもの好きの子どもたちのために、勝手に最適化に挑戦してみましょう!
問題設定
50音ポスターに登場する「あ」〜「ん」までの45文字と、同じく45種の「のりもの」を割り当て、よりよい50音ポスターに改良したい。
ただし、50音ポスターは以下の制約を満たす
- 「音」に割り当てる「のりもの」は、必ず文字列中にその「音」を含む
- 例えば、他の組み合わせがいくら良くても「あ」には「えすえる」を割り当てられない
- 濁点、半濁点、捨て仮名(「ょ」「っ」などの小さい文字)を変形して清音とはしない。
- 例えば、「た:だんぷとらっく」や「つ:そにっく」とはしない。
解く
「良い50音ポスター」とは何か、次のとおりに仮説を立てます
- 「音」が「のりもの」の文字列中、早く登場するほど良い
- 例えば、「あ:ゆあつしょべる」 より「あ:あずさ」のほうが良い
- 「音」が現れる回数は多ければ多いほうが良い
- 例えば、「い:いなほ」よりも「い:いちじていし」のほうが良い
この仮説は、次の関数によるスコア化で反映することにします
# kanaに対してwordを割り当てたときのスコア
def word_score(kana, word):
s = 0.0
for i, c in enumerate(word):
s += pow(0.5, i) if c == kana else 0
return s
つまり、1文字目なら1点、2文字目なら0.5点...と、 0.5^(文字の位置)を部分点とし、もし複数回文字が出現する場合はそれぞれ足し合わせます。
例えば、「あ:あずさ」なら1点、
「し:しーしゃーぷ」なら、1+0.25で1.25点です。
(しーしゃーぷはのりものではありません。)
この関数で各「音」に対するのりものの割り当てをスコア化し、
全ての割り当てのスコアの合計を、50音表のスコアとします。
この問題は、1対1のマッチング問題に帰着します。
ただし、今回は探索空間がそれほど広くないため、深さ優先探索で総当り的に調べました。
プログラムの実行時間は1~2秒でした。
結果
制約を満たす割り当て方法は全部で818通り見つかりました。
この内、オリジナルの割り当て方法のスコアは約29.77で、101位タイでした。
最適解のスコアは31.88となりました。
最適解では、「あ」「う」「か」「さ」「と」「な」「ほ」「や」「ろ」の9音でオリジナルと異なるのりものが割り当てられました。以下は、その詳細です
音 | オリジナル | 最適解 | スコア差分 |
---|---|---|---|
あ | あずさ | いーすとあい | -0.9375 |
い | いちじていし | - | |
う | しんごう | すいなんきゅうじょしゃ | -0.109375 |
え | えすえる | - | |
お | おうだんほどう | - | |
か | ぱとろーるかー | かがやき | 0.96875 |
き | きゅうきゅうしゃ | - | |
く | だんぷとらっく | - | |
け | けいてきならせ | - | |
こ | こだま | - | |
さ | はやぶさ | あずさ | 0.125 |
し | しろばい | しんごう | ±0 |
す | すーぱーあんびゅらんす | - | |
せ | らくせきのおそれあり | - | |
そ | そにっく | - | |
た | きんたろう | - | |
ち | こまち | - | |
つ | つばめ | - | |
て | てんくう | - | |
と | いーすとあい | ぱとろーるかー | 0.375 |
な | すいなんきゅうじょしゃ | いなほ | 0.25 |
に | にちりん | - | |
ぬ | すぺーしあきぬがわ | - | |
ね | こうふくのまねきねこでんしゃ | - | |
の | のぞみ | - | |
は | はしごしゃ | - | |
ひ | ひのとり | - | |
ふ | ふみきり | - | |
へ | へりこぷたー | - | |
ほ | いなほ | ほいーるろーだー | 0.75 |
ま | まりんらいなー | - | |
み | ごみしゅうしゅうしゃ | - | |
む | かむい | - | |
め | ろめんでんしゃ | - | |
も | ももたろう | - | |
や | かがやき | はやぶさ | 0.25 |
ゆ | ゆあつしょべる | - | |
よ | ばくはつぶつしょりようぐうんぱんしゃ | - | |
ら | らびゅー | - | |
り | りょかくき | - | |
る | ぶるどーざー | - | |
れ | れすきゅーしゃ | - | |
ろ | ほいーるろーだー | しろばい | 0.4375 |
わ | そうわんじゅうき | - | |
を | ふみきりをつうか | - | |
ん | ぽんぷしゃ | - |
新しく1文字目になれたのは、「か:かがやき」と「ほ:ほいーるろーだー」です。
逆に、「あ」は「あずさ」から「いーすとあい」に変更したため、1文字目を逃しました。
全面的な入れ替わりが起こったというよりは、細かい改善の積み重ねに見えます。
全体的な印象が、大きく変わるというほどではありません。
そう考えると、オリジナルも厳しい制約の中でよく健闘していたと評価できます。さすが学研さん、いい仕事しますね!
色々文句を言ってすみませんでした!
まとめ
- 最強のりものヒーローズ3-4月号 ふろく「のりもの ひらカナかずポスター」を最適化しました
- 深さ優先探索で、オリジナルよりも良い割り当て方を発見することができました
- オリジナルの割り当てが十分健闘していたことを確認しました
以上です。
Discussion