染色体のコード化は、GAを使って問題を解こうと始めるたときに、問題になることの1つです。 コード化は非常に問題に依存します。

この章では、以前に成功したいくつかのコード化の方法を紹介します。





バイナリーエンコーディング

バイナリーエンコーディングは最も一般的なものです。

バイナリーエンコーディングではすべての染色体は、0または1ビットの文字列となります。

染色体 A 101100101100101011100101
染色体 B 111111100000110000011111

バイナリーエンコーディングによる染色体の例

バイナリーエンコーディングは、少数の対立遺伝子でも多くの可能な染色体を表現できます。一方で、このコード化は多くの問題にとって自然ではないことがあり、交叉や突然変異の後に修正が必要になることがあります。


例題: ナップザック問題
問題: 複数の荷物に対して、それぞれ大きさと値があたられます。 ナップザックの容量が与えられます。 ナップザックの中の荷物の値を最大化するように荷物を選びます。 しかし、ナップザックの容量を拡張することはできません。
エンコーディング: 各ビットはナップザックの中の荷物に対応します。





順列コーディング

順列コーディングは巡回セールスマン問題や、仕事の順番など、並べ替え問題に使うことができます。

順列コーディングでは、各染色体は順序を表わす数の文字列をもっています。

1  5  3  2  6  4  7  9  8
8  5  6  7  2  3  1  4  9

順列コーディングの例

順列コーディングは順序に関する問題にのみ有効です。


例題: 巡回セールスマン問題 (TSP)
問題: 都市とそれぞれの都市間の距離が与えられています。巡回セールスマンは与えられた都市をすべて回る必要があります。しかし彼はあまり旅が好きではありません。もっとも旅行する距離が短い順番を探します。
コード化: 染色体は都市の順番を表わします。セールスマンはその順番で回ります。




実数値コーディング

実数のような複雑な数が使われる問題で、直接実数値コーディングがつかわれます。 これらの問題でバイナリーコーディングを使うのは非常に難しいです。

実数値コーディングではすべての染色体は、値の文字列からなっています。

1.2324  5.3243  0.4556  2.3293  2.4545

実数値コーディングはある種の問題に対して非常に有効です。 一方で、このコーディングは問題に適した新しい交叉と突然変異を考える必要がしばしばあります。


例題: ニューラルネットワークの重み付けを探す
問題: 与えられた構造を持つニューラルネットワークがあります。望ましい出力を得られるように、各入力に対する重みを見つけます。 コード化: 染色体の実数は入力に対応する重みを表現しています。




木コーディング

木コーディングは主に進化的プログラムや遺伝的プログラミングの表現に使われます。

木コーディング内ですべての染色体は、プログラム言語のコマンドや関数のようなオブジェクトの木です。

染色体 A

染色体 B

( +  x  ( /  5  y ) )

木コーディングの例

( +  x  ( /  5  y ) )

木コード化は進化的プログラムに適しています。 LISPというプログラム言語はこれに対して、しばしば使われます。 なぜならば、それの中のプログラムはこの型を表現します。 また簡単に解剖することができます。 ですから、交叉や突然変異を相対的に簡単に行うことができます。


例題: 与えられた値から関数を見つける
問題: 入力と出力の値が与えられます。問題はすべての入力に対して最も良い(ほしいものにもっともちかいもの)を与える関数を探すことです。
コード化: 染色体は木で表現された関数です。