6

Rastrigin 関数の最小値を計算する遺伝的アルゴリズムを実装しようとしていますが、いくつか問題があります。
染色体をバイナリ文字列として表現する必要があり、ラストリン関数は数値のリストをパラメーターとして受け取るため、染色体を数値のリストにデコードするにはどうすればよいですか?
また、Rastrigin はリスト内の要素を -5.12<=x(i)<=5.12 にすることを望んでいます。染色体を生成するときに、その間隔にない数が生成されるとどうなりますか?

4

5 に答える 5

7

遺伝的アルゴリズムの実装を検討しています。実装は、 Rastrigin関数だけでなく、一般的な最小化 (または最大化) 問題に対しても機能するようにする必要があります。バイナリ コード化された GA または実数コード化された GA を実装することを決定できます。どちらにも独自の用途とニッチな用途があります。しかし、あなたのために、Real コード化された GA を実装することをお勧めします。何をすべきかについての質問によると、生成された変数の値が [-5.12:5.12] の範囲外にある場合、Real コード化された GA とバイナリ コード化された GA はそれらを異なる方法で処理します。

独自のバージョンの実装を開始する前に、参照コードを用意しておくことをお勧めします。C 実装を探している場合は、ラボのソース セクションに Real Coded GA 実装があり、これは私たちや他の研究者によって広く使用されています。それを試してみて、そこにある簡単な最適化問題をいくつか試してみることをお勧めします。

Pyevolveは、遺伝的アルゴリズムと遺伝的プログラミングのための Python ライブラリです。

さて、実装について話しましたが、GA の理解は明確ですか? そうでない場合は、最適化の観点から GA を紹介するこのチュートリアルを参照してください。Binary Coded GA のクロスオーバーと突然変異の説明は、Real Coded GA に自動的に転送されないことに注意してください。実際にコード化された GA には独自の複雑さがあり、いくつかの論文を読んで理解するには時間が必要です。急ぐ必要はありませんが、フルタイムで努力すれば、簡単に始めることができるはずです。

于 2010-02-02T06:22:14.903 に答える
3

染色体をバイナリ文字列として表現する必要があるのはなぜですか? 他の型を使用する進化的アルゴリズムを作成できます。数字のリストを使用できます。

値の制限に関しては、母集団の初期メンバーを生成するときに、乱数が必要な範囲内にあることを確認してください。突然変異演算子を制限して、この範囲外の値を生成しないようにします (この範囲外の値を単に切り捨てるか、ラップアラウンドさせることができます)。

本当にバイナリ文字列を使用する必要がある場合は、Gray Codeを見てください。これは、数値をバイナリでエンコードして、数値を変更しやすくする方法です。

于 2010-02-01T20:39:45.103 に答える
1

実数値の問題の解をビット文字列としてコーディングすることは、実際には適切な方法ではありません。数値をビット文字列として取得した場合、数値を表すために固定小数点数を使用しています。アルゴリズムが固定小数点エンコーディングの精度まで最適に近づくと、それ以上の進歩はありません。より多くのビットを使用できますが、収束が遅くなります。実際には、深刻な問題では、このようなアプローチは、浮動小数点値で動作する有能なアルゴリズムよりも数桁遅くなります。

浮動小数点数を使用すると、通常の 64 ビット数を使用しながら、1e-10 などの最適値にはるかに近づけることができます。さらに、最新の進化的アルゴリズムは、適応スキームを使用して、最適化中に突然変異ステップを調整します。このようなメカニズムにより、固定された突然変異ステップと比較して、収束速度が向上します。これをチェックして、典型的な進化的オプティマイザーが Rastrigin 関数で何を達成するかを確認してください: http://coco.gforge.inria.fr/doku.php?id=bbob-2010

于 2011-11-15T12:43:49.607 に答える
0

興味があれば、私は Pyevolve を使用して実装を行いました: http://pyevolve.sourceforge.net/examples.html#example-7-the-rastringin-function 名前のタイプミスで申し訳ありません。

于 2010-03-08T18:18:08.860 に答える
0

C でプログラミングしていると仮定します。整数 (C 言語の場合は int) は、4 バイト/文字 (32 ビット) の配列としてパックできます。あなたの配列が

char* chrom_as_bytes=(...)

int* にキャストすることで i 番目の値を取得できます

int ith=3;
value=((int*)chrom_as_bytes)[ith];

値が -5.12<x<5.12 の範囲にない場合、適合度関数は非常に悪い値を返す必要があり、進化のこのステップは次の世代で破棄する必要があります。

ウィキペディアの記事も参照してください。

于 2010-02-01T20:39:23.233 に答える