kagamihogeの日記

kagamihogeの日記です。

わたしがアルゴリズムをまなぶ理由

先日、何時ものように地元の最寄り駅に帰ってきて、駅前のタクシー乗り場を横目に帰路に着こうとしたとき「おやっ?」と思った。最近整理されて稼動し始めたタクシープールはこんな感じになっている。

某駅のタクシープール

タクシーは 赤の番号順で、じゅんばんこにお客さんが待っているタクシー乗り場へ出て行く。あとから来たタクシーは、各々いちばん空いてる列に並んでいく。こうすることで、せまっくるしい駐車スペースに出来るだけ多くのタクシーが待機することができ、かつ、ソレナリに公平な順番でタクシーはお客さんを乗せることが出来る。

家に帰りながら↑な感じの図を頭の中で思い浮かべて「なるほどねぇ……」と浸っていたんだけど、更に図をもっと極端に簡略化してしまうと、こういう風にも簡略化できちゃうなぁ、と思った。

某駅のタクシープール、実は一列

タクシープールを見てると、最初に来たタクシーの運ちゃんが最初にお客さんを乗せられるようになってる。ってことは実はタクシーの列は一列なんだなぁ、と。しかし、物理的な駐車スペースは四角い土地だから、タクシーの列も一列にするのは難しい。そこは一工夫して「見た目四角、だけど一列」になるようにしている。これで、四角い土地にタクサンタクシーが待機できる。タクシーの運ちゃん同士、順番でケンカにならないように良く出来てるなぁ、とか余計なことも色々思ったんだけどまぁそれはそれとして。

某駅のタクシープールはキュー

「これってキュー(queue)だよなぁ」と。アルゴリズムの本とか、ネットワークの本とか、OR(オペレーションズ・リサーチ)とかの本で良く出てくる、キュー。タクシーをいっこのパケットみたいに考えてるワケです。

定番なアルゴリズムって、実はふだんのプログラミングだけでなく、実生活にも良く出てくるものがちょくちょくあるんですよ。おそらくタクシー乗り場作った土建屋さんたちの建築業界にもキューみたいな定番設計集みたいなのはあると思う。だからこういう作りになってるんじゃないかなぁ? と思うし、定番設計集が無かったらすっごい苦労してたと思う。

まぁ、もしかしたら設計士の知り合いのネットワーク屋さんが「キューでおk」とアドバイスしてくれたのかもしれないけどw

けれども、アルゴリズムの勉強は、特定の問題についての実装法を勉強することではない。

アルゴリズムデザインの夢 - 2008-10-25 - きしだのはてな より抜粋

っていうのはそういうことなんだと思う。



けど、アルゴリズムなんかの勉強って有り難味が分かりにくいんだよね。

大学は奥義を教えてくれるが、それがなぜ奥義なのかは教えてくれない

学生時代にこんな皮肉を聞いたことがあるんだが、さもありなんだなぁ、とw 定番アルゴリズムとかコンピュータ・サイエンスとか、そのままじゃクソの役にも立たないんですよ、いやマジで。

が、実際には現実で奥義を使うべき時があるからこそ「定番アルゴリズム」なわけで。ちょっと良い例えが出てこないんだけど、俺はツマランツマラン言われる業務アプリのプログラミングの下請の仕事がいちばん長いんだけど「お、これはあの定番アルゴリズムでいうところのアレだなぁー」みたいに思うことはちょくちょくある。勘違いしてほしくないのは、ライブラリとして整備されたキューのクラスを使うとかそういうレベルではモチロン無いです。

大学で定番アルゴリズムとかを勉強してたのはもう 10 年は前になるけど、最近やっとこ大学でコンピュータ・サイエンスをカジっといて良かったわーと思うようになった。それなぜ? ってのは……ちょっと上手く文章に出来ないんだけど、タクシープールの例みたいな感覚です。なので、イマイチ文章に落とし込めない……

奥義を現実の問題に落とし込むのは大変

「奥義」を現実の問題に対する解として落とし込むのはすっごい大変なんですよ。最近だと F1日本GP2008@富士スピードウェイが情報工学的な意味で相当すごかった - 肉とご飯と甘いもの @ sotarok が良い例かな、と。これって根本的な問題は↑のタクシーの例とアンマリ変わらないと思う。モチロン、F1 というハイパー大規模イベントに対抗するには、向き合わにゃならん問題はもっと莫大なものになるんだけどさ。

けど、余計なものを削って削って根本的な問題って何なの? ってことを考えていくと、割とシンプルなモデルになっちゃったりもする。モデリングとか見える化とか、そんな感じなんじゃないかな、と思う。実際にそーいう仕事はしたことないけどw

富士スピードウェイの例もそうだけど、当たり前のことを当たり前にやる―フツウのことをフツウにやる―のは大変だったりする。で、その大変をナントカカントカするためには定番アルゴリズムみたいなのが何気に有効だったりする。で、世の中のエライ人たちは定番アルゴリズムみたいなカタチで、ナントカカントカする方法を一般化・抽象化してくれてるわけです。が、一般化・抽象化されてると今度は「何それよくわかんねぇ」「それどう使うの?」みたいな話になるわけで。

そこのギャップを埋める方法は俺には妙案は無いけど、ここはもう「奥義って何で奥義なの?」って考えないとダメな部分はあるよなぁ、とも思います。

ファインマン物理学を読む」とか「ソフィーの世界の世界」みたいに、「アルゴリズム・デザインを読む」のような本が必要なんじゃないかと思う。

アルゴリズムデザインの夢 - 2008-10-25 - きしだのはてな より抜粋

ある分野ではトーゼンの理論が別分野に活きることも

ここから、話はちょっと別の方向に飛んでいきます。

最近 ウィキノミクス を読み出してるんだけど、本の最初の方で、ある金鉱山がある方法で再生を遂げた例が載っていた。詳細は省略するけど、すっごく端的に言うとネットで別分野の人間にヘルプを求めたんです、電車男が「めしどこか たのむ」なノリで。

おもしろいのは、鉱山とはナンも縁が無い人たちの意見によって再生を成し遂げた点。俺にはそれが、規模は違えど、タクシープールでキューを見たようなノリに近く見えた。ある分野では当たり前のことが、他の分野に活きることって結構ある気がするんですよ。OR とかロジスティクスとか言われてるのも元々は兵站から来てるしね。

で、今はネットによって情報だけはカンタンに伝えられちゃうから、ネットワーク屋さんが土建屋さんの設計にアドバイス(たとえば「タクシープール? キューでおk」)、みたいなことはこれから増えてくのかな、とか思う。すごいマッシュアップ、みたいな感じ?

だから、俺は定番アルゴリズムみたいな「ある分野でのキホン」を学ぶ意味はこれからもっと重要性が増していくと思う。俺がアルゴリズムをまなぶ理由(今勉強中なワケではないけど)は、そういうことだと思う。フツウのプログラマがフツウに生きていく、って、もしかしてそういうことかな? ってモヤモヤと感じる。

無論、ソレによって既存の分野がカンタンにひっくりかえったりしちゃう問題もあるんだけど…… ウィキノミクス がまだ途中読みなのでこの辺でおわり。