各種探索法を身につけたいとき

オレは高専時代にプログラミングコンテストにハマってて、よく後輩たちにアルゴリズム講義をしていた。今だったらこうやって説明するぜ!っていう話を少し書いてみる。断わっておくけど、あまり自分は知的レベルは高くはないので、同等の知的レベルの人向けということでよろしく(笑)。
探索のビギナーにとって厄介なことの一つに、方法論の多さがあると思う。これは例えば「全探索」「深さ優先」「幅優先」「枝刈り」「貪欲戦略」「分割統治法」「メモイズ」「動的計画法(DP)」などのことね。こんだけいきなり言われても、めんどいしややこしいし、若い子だと取り組まないかもしれない。そこで、そのモチベーションをなんとかして上げれないか、今日は頑張ってみる。
あまりに突然に話が変わるが、RPG(e.g. ポケモンとか)の敵キャラには「属性」ってのがある。火・水・雷・光・闇みたいなね。で、水は火に強くて、雷は水に強い、というような強弱関係がある。だから火属性のキャラには、水属性の魔法や武器を使うと効率的にダメージを与えられるわけだ。・・・んじゃあ、その属性を知るにはどうしたらいいか?。一番は敵キャラの名前から推測だろうか。「ファイアーマン」とかだったら(笑)、おそらく火属性だろうと容易に想像がつく。また敵キャラのグラフィックからも推測できるだろう。それでも無理な場合は、ステータス解析魔法(e.g. FFのライブラ)を使えば良い。
で、話を元に戻す。探索が必要となる問題(敵キャラ)にも、火や水のように簡単に一言では表せれないけど、いわゆる属性というのがある。そして各属性に有効な手法(魔法や武器)ってのがあって、それが先ほど述べた「深さ優先」とか「貪欲戦略」とかのキーワードに相当する。つまりこれは属性魔法であり、それを習得することで、敵問題に効果的に対処できるわけだ。あまりに弱い敵だったら(解くべき問題のサイズが小さい時は)、効率性はそんなに気にしなくてもいいのだけれど、そうでないときはこの魔法を知らずして・使わずして倒すのは無理だと思ったほうがいい。だから、まずあなたのレベルを上げて、まだ知らない魔法を使えるようになろう。君はRPGの主人公だ!(とか言ってみる)。
ただ、これだけじゃ足りない。だって肝心の問題の属性が分からないから。この属性を見抜くというのは結構難しい。現実世界においては、実はライブラが一番ハイレベル魔法なんじゃないかとオレは思ったりする(笑)。たくさんの問題に取り組んで慣れていくのもあるけど、逆にそれで思考が狭くなる時もあるかもしれない。ただ、魔法に関する理論を洗練していくことで、より効果的に問題の属性を推測することはできるように思う。
というわけで、他愛もない話おわり(笑)。どっかの誰かのターニングポイントになれば幸いです。各魔法(探索手法)のより詳しい話は、気が向いたときにでも別エントリとして書きまーす。