はじめに
遺伝的アルゴリズム(GA)という言葉には、神秘的な響きと知的好奇心をくすぐる魅力があります。筆者がこの言葉を見たのは、1987年の別冊サイエンス中の記事「flipがすむ原始のコンピュータの海で遺伝的アルゴリズムを探検する」でした。これは、flip(finite
living blob:有限生命体)と名付けられた仮想の生物の進化をシミュレートするものでした。その生物に課せられた進化の目的は、自然環境からある記号列を受け取り、その記号列に出現する記号を予測するような能力を獲得することです。いわゆる有限オートマトンの機能を獲得させようというわけです。したがって、記号の出現をうまく予測できた者ほど優秀な個体であり、また、優秀な個体ほど子孫を残しやすくする工夫を持ち込むことで、そのうち完全なる予言者が出現するようになるというわけです。
ただ、少々概念的な話が多くて、実際の具体的な仕事をしていた筆者には、なにやら悠長な話だなといった感覚しかなく、そのときは、それをどうこうしようなどとは考えませんでした。恐らく、この言葉を初めて聞きあるいは目にして、その簡単な説明を聞いただけでは、成り行き任せの考えから、本当に有効な結果がもたらされるのか疑問に思う人が多いでしょう。残念ながら筆者もその一人でした。でも、今にして思えば、なんて浅はかだったんだろうと後悔をしています。一度この仕組みが理解できると、誰にでも簡単にプログラムができて、最短経路や最適な計画が求められることがわかるようになります。そして遺伝的アルゴリズムは皆さんの問題解決能力に1つの武器を与えてくれるでしょう。
さて、遺伝的アルゴリズムとは何者なのでしょう?平たく説明すれば、ダーウィンの進化論、性格にはネオダーウィニズムの考え方を、ほとんどそのままアルゴリズム化したものです。すなわち、与えられた自然環境の中で、個体集団の各個体同士が交配と突然変異を繰り返しながら、その自然環境によく適応する個体ほど生き残り、子孫を増やすことができるようにするアルゴリズムです。自然環境に適応するということは、そのときに与えられた環境での各種の条件下で、その個体がいかにうまくやっていけるのかということです。もちろん自然環境は、季節によりある範囲の変化が絶えず起こってしまいますし、時がたつにつれて徐々に変化していきますから、そこでの個体は、環境が一定の場合とは異なった戦略をとる必要があるでしょう。ただいずれにしても、自然環境とは個体に与えられている外部からの条件ということになります。ここで曖昧に個体という表現を使っていますが、より厳密にいえば、遺伝子とその表現型であるカラダとの総体のことです。動物のカラダは、御存知のように蛋白質で成り立っています。その成り立ちを決めているのが遺伝子なわけですが、遺伝子だけでは環境に作用することができません。そこで、カラダという遺伝子の入れ物があるわけです。遺伝子は自分が生き残るために、この入れ物をデザインして環境をうまく利用できるように仕組んでいるともいえます。たとえば、海という環境で生きるためには、海水から酸素を得るデザインが必要だし、抵抗の大きい海水中で素早く動きまわれるデザインが必要です。これらのデザインは、同じ海の中でも少し戦略を変えると、大きく変化してしまいます。海老などは、素早い動きの代わりに堅牢な鎧をデザインとして採用しています。このように、同じ環境でも、その環境を利用するためのデザインはかなり変化に富んだものとなります。つまり自然環境に適応するということは、遺伝子が生き残っていけるよう、環境を利用できるデザインに発展させることであるともいえます。本書には、遺伝的アルゴリズムという人工的な仕組みを各種の応用に適用させようという目的があります。自然界での環境適応という意味は、ここでは、応用問題における各種の制約条件や評価基準となります。通常、応用問題の世界では、これらの条件は一定ということで解法を実現しています。その意味では自然界よりも単純な仕組みがあればいいわけです。ところが、最近では、金融や証券といった世界での金利や株価予測などのカオス的挙動を示す分野での応用に代表されるような、環境の変動をも考慮した方式が必要になってきています。これは、まさに、自然界での進化プロセスそのものです。遺伝的アルゴリズムの特色は、このような環境の変化も簡単にモデル化してしまえるところにもあります。本書では、環境の変化に対応するような応用は掲載していませんが、条件一定での応用の要領がつかめれば、拡張することは比較的容易だと思います。
それでは、条件一定という各種の制約条件の下で何らかの評価値を最適な値にするということを考えてみましょう。たとえば、東京から長崎へ何らかの交通機関を使用して行くとします。ここで3日以内に目的血に着くという制約条件をつけて、旅行費用最小コースを選択する問題を考えてみます、明らかに、コースを表現するのが個体の遺伝子で、自然環境の制約条件、評価値はそれぞれ「3日以内」と「旅行費最小」ということになります。実際に計画を立てている様子を想像してみましょう。このコースを表現する遺伝子は、たとえばいくつかの中間地点を持った路線図を書いたメモみたいなものです。このメモがいくつか用意されていて、それぞれに旅行費用が算出されています。ここで、そのメモのうち旅行費用が安いメモを2つ選択して、それらの親メモに記されている中間地点を境界にして親メモをハサミで切断します。この切断のとき注意しなければならないことは、切断される中間地点は、両親とも同じになるようにすることです。そうすると、いくつかの部分的なコースが要素として出てきます。この要素を中間地点が一致するように交換すると新しいコースが生じますが、これを子メモとしてその旅行費用の算出をしておきます。かなり煩雑ですが、このような操作を繰り返しているうちに、考えもつかないような旅行費用最小のコースが産まれてくるかもしれません。当然ながら、このような操作を紙とハサミを使って行っていては、いくら時間があっても願い下げです。幸いにも、以上の手続きは単純ですので、プログラミング能力があれば、誰にでも容易に計算機上で実現しシミュレーションできます。
遺伝的アルゴリズムはこのように、ダーウィンの進化論を全面的に正しいと信じて構成されているわけですが、進化論の世界では、反ダーウィン主義の考え方もあって、多くの議論がなされています。ダーウィンの進化論のどのような点が主に問題となっているのかというと、進化は漸進的に変化し、枝わかれして今のような生物の種類が生まれてきたということに関してです。このダーウィンの主張に対する反証として引き合いに出されるのが、化石にその証拠が見いだされないということなのです。つまり、もし漸進的な進化が真実ならば、もっと短い首を持つキリンの化石が見つかってもいいはずなのに、化石を見るかぎりにおいては突然首が長くなっているとしか解釈できないということです。この議論は、ダーウィンが『種の起源』を発表して以来続いていることなのですが、最初の頃は、地球上の全化石が調べられたわけでもないので、そのうち漸進的進化を裏付ける証拠が出るだろうと期待されていました。しかし、今日に至るまで、その種の化石は発見されていないようなのです。バージェス頁岩の話はご存知の方も多いと思います。1909年に約6億年前のカンブリア紀の動物化石が大量に発見され、その中に
漸進的進化を説明する中間的な動物化石が含まれているだろうと期待されていました。でも、その後の研究によってもその兆候は発見されず、むしろ、カンブリア爆発として有名な生物種の大量発生の時期であったことを改めて示す結果となっています。つまり、バージェス頁岩中の動物達は皆、それまでには知られていなかった新たな種類の動物で充分に分化した後の系統木の末端に位置するものであるとの見方がなされています。決して、ダーウィンが望んでいた中間型の動物とはならなかったわけです。その他、爬虫類から鳥が進化したと言われていますが、その形態上の中間的生物の化石が発見されていないことや、鳥の翼にはえている羽の緻密な構造が試行錯誤を前提とした漸進的進化では、どう説明してよいのか不明なのです。始祖鳥の化石は有名ですが、始祖鳥は鳥に極めて近い存在ですので、先の中間物とはいいがたいものがあります。
生物の進化ともなると、その時間スケールは長すぎておいそれと実験室で実験するわけにもいきません。しかし化石が生物の進化を充分な精度で再現しているのかといえば、そうではなさそうです。特に進化の系統上、欠落していると思われる部分が、本当に存在していなかったのか、あるいは化石になる機会がなかったのかを決定することはできません。化石になれる条件は、かなり厳しいものがあるでしょうから、存在していなかったことを示すのは化石だけからでは無理なのではないでしょうか。とすれば、何か別の理論的な考察を持ち込む必要があるでしょう。実は、Richard Dawkinsがそのような考察を加えて、累積淘汰という考え方を提唱しています。これは、小さな突然変移が遺伝子の中に蓄えられていき、やがては、種をも越えるような変化がもたらされるというものです。彼はこの考え方を示すために、9つの遺伝子により形態を決めることができる架空の生物を考え、遺伝子の変化から得られた形態を人為的に選択して、ある意図で進化を繰り返していけるようなちょっとしたシミュレータを作りました。もともとは、再帰プログラムの例題によく使われる樹木の発生を利用したものですが、この発生アルゴリズムと9つの遺伝子をからませて発生の仕方を変化させるようになっています。第1から第3遺伝子までは、樹木の横方向の枝振りに変化を与え、第4から第8遺伝子までは、縦方向の枝振りに変化を与えるようになっています。最後の第9遺伝子は、枝の分枝数を示しています。人為陶汰のやりかたは、現在の遺伝子からその9つの遺伝子それぞれの値を1だけ増減させるとすべてで18個の違った遺伝子が得られますが、それらの形態を表示して人間が選択するようにします。こうして選択した1つだけを次の世代としていくわけです。彼自身も彼の著書『ブラインド・ウオッチメーカー』で書いているように、単に樹木の形態的な変化が起こるだけで、樹木の域を越えることはないと予測していたようですが、人為陶汰を繰り返すことにより、カエルやコウモリやトビケラ、アゲハチョウなど樹木の世界を飛び越して多くの動物たちを生み出せるようになったということです。
最初は、ほとんど1点かあるいは1本の棒だったものが、人為選択を繰り返すことにより、大きく変化していく様子は確かに感動的です。結局、小さな突然変移とは、毎回の遺伝子の僅かな増減なのですが、それが積み重なることで形態に大きな変化を与え得るということを示していることになるわけです。
生物学の世界では、ダーウィンの進化論だけでなくこれまでにいくつかの異なった立場での進化論が登場してきましたが、本書は、そのような進化論のどれが正しいのかについて議論するといっただいそれたことをするものではありません。むしろ、ダーウィンの進化論を正しいものとして、進化というプロセスが工学的な応用に使えそうだという、少々乱暴ではありますが実際的な興味を主体に記述することにします。

本書の構成
筆者の前著『Cでつくるニューラルネットワーク』においてもそうでしたが、本書においても理論的な解説については、世の中に優れた成書がありますので、そちらを参考にしていただくという立場をとりたいと思います。本書では、遺伝的アルゴリズムの応用面に焦点をあて、どうしたら与えられた問題に遺伝的アルゴリズムを適用できるのかが習得できるような内容となっています。
構成は、第2章で遺伝的アルゴリズムの解説を行い、第3章以下で、個別の応用問題を取り上げます。また、プログラムはWindows3.1のSDKを用いて開発していますが、Windowsプログラミングについての解説は本書の目的ではありませんので、極力記述を避けています。しかしながら、全体の動作とプログラム構造については、各応用問題に共通な構造をとっていますので、第3章で少し詳しく紹介します。したがって、第2章と第3章を先に読み、他の章は興味あるところから読んで頂いても結構です。

あとがき
筆者が遺伝的アルゴリズムに本格的に係わりだしたのは、拙著『Cでつくるニューラルネットワーク』の執筆を終えた頃からでした。そのころ、従来の論理をベースとした手続指向やルール指向のプログラミングでは、実現不可能な領域があるのではないかと感じだしていました。少し高尚な表現をすれば、デカルト流の還元主義ではなく対象を全体として捉える方法が必要だということです。言葉にしてしまえば、簡単なのですが、具体的にどう展開できるかはわかりません。
当時、ファジィー、ニューラルネットワーク、遺伝的アルゴリズムを並べて眺めていると、複雑さと集団とへ立ち向かう武器に見えていたものです。また、一方では、生物の情報処理の巧みさに感心もありましたから、少なくともニューラルネットワークと遺伝的アルゴリズムは理解しておく必要があるだろうと思い、ことあるごとに応用を企んでいたわけです。そのうち、人工生命という枠組みが提案されていることを米国主張の折に知り、「全体として捉える」ということに対するアプローチへのヒントがあるに違いないと確信するに至りました。
このあたりがベースになって、本書を書くことができました。ニューラルネットワークと遺伝的アルゴリズムを組み合わせた例も多く報告されていますが、本書では、そこまで立ち入ることができませんでした。この点が筆者の心残りとなってしまいました。
なお、本書を執筆するにあたり、応用に重点をおき、可能なかぎり具体化をこころがけたつもりです。前著同様、具体的なプログラミングを通して、多くの人に遺伝的アルゴリズムの利用技術を理解していただければ幸いです。
末筆になりましたが、本書の企画を取り上げて頂いたパーソナルメディア株式会社出版部、特に本書をより親しみやすく読みやすくするような紙面作りやきめ細かな校正をしていただいた編集の皆さんに深く感謝いたします。
|