3

私は自分の問題(大学のプロジェクト)に合わせてカスタマイズされた遺伝的アルゴリズムを実装する必要があり、最初のバージョンでは、短い行列(染色体あたりのビット数x人口のサイズ)としてコード化されていました。

短いと宣言しているのですが、「0」と「1」の値のみを使用しているため、これは悪い設計でした...しかし、これは単なるプロトタイプであり、意図したとおりに機能しました。今度は、新しいものを開発するときです。 、改良版。ここではパフォーマンスが重要ですが、シンプルさも高く評価されています。

私は周りを調べて思いついた:

染色体の場合:-文字列クラス(「0100100010」など)-boolの配列-ベクトル(ベクトルはbool用に最適化されているように見えます)-ビットセット(最も自然なものに聞こえます)

そして人口のために:-C配列[]-ベクトル-キュー

クロモソームにはベクトル、ポップには配列を選ぶ傾向がありますが、このテーマの経験がある人の意見をお願いします。

前もって感謝します!

4

4 に答える 4

7

人口と遺伝子へのランダムアクセスが必要だと思います。パフォーマンスが重要だとおっしゃっていますが、私はそれを実行速度と解釈しています。vector<>したがって、おそらく染色体には avector<char>を、遺伝子にはa を使用するのが最善でしょう。その理由vector<char>は、bitset<>vector<bool>がメモリ消費に対して最適化されているため、速度が遅いためです。 vector<char>x8メモリを犠牲にして高速化しcharます(システムで=バイトと仮定)。したがって、速度が必要な場合は、 を使用してvector<char>ください。メモリ消費が最優先の場合は、vector<bool>またはを使用しますbitset<>bitset<>ここでは当然の選択のように思えますが、これはビット数に基づいてテンプレート化されていることに注意してください。つまり、a) 遺伝子の数を固定し、コンパイル時に知る必要があります (これは大きな問題だと思います)。いいえ)、および b) 異なるサイズを使用すると、使用する各メソッドbitsetのサイズごとに1 つのコピーが作成されbitsetます (ただし、インライン化によりこれが無効になる場合があります)。つまり、コードが肥大化します。全体として、vector<bool>あなたが望まないのであれば、あなたにとってより良いと思いますvector<char>

の美学が気になる場合は、より自然に見える を使用vector<char>できます。typedef char gene;vector<gene>

Astringは a に似てvector<char>いますが、より扱いにくいです。

于 2009-07-09T06:12:32.600 に答える
1

特にあなたの質問に答えるために。私はあなたが何を提案しているのか正確にはわかりません。あなたは配列と文字列クラスについて話します。キュー、ビットセット、ベクトル、リンクリストなどを使用できるSTLコンテナクラスについて話しているのですか。人口に対応するベクトル(C配列に最も近いもの)と、染色体に対応するビットセットをお勧めします。メモリ容量が気になります。それ以外の場合は、すでにDNAの文字列表現のベクトルを使用しています。("10110110")

アイデアと手を出すための良いツールのために。このライブラリをダウンロードして最初に使用することをお勧めします。主要なコンパイラで動作します。UNIXの亜種で動作します。すべてのソースコードがあります。

フレームワークのすべてがあなたのために行われ、あなたは多くを学ぶでしょう。後で、独自のコードを最初から作成するか、これらのクラスから継承することができます。必要に応じて、商用コードで使用することもできます。

それらはオブジェクトであるため、整数から実数、構造、ツリー、ビット配列などにDNAの表現を簡単に変更できます。

常に学習治療が含まれていますが、それだけの価値があります。

私はそれを使用して何千ものニューラルネットを生成し、単純な適応度関数でそれらを取り除き、実際に実行します。

ガリブ

http://lancet.mit.edu/ga/

于 2009-07-09T05:07:07.397 に答える
0

これを自分でコーディングしたいと仮定すると (外部ライブラリが必要な場合は、kingchris が良いライブラリを持っているようです)、どのような操作を行う必要があるかによって異なります。メモリの観点から費用対効果を最大限に高めるには、任意の整数型を使用し、ビットマスクなどを介して個々のビットを設定/操作できます。このアプローチは、使いやすさの点で最適ではない可能性があります...上記の文字列の例は機能しますわかりましたが、ショートとは大きく異なりません。ここでは、16 ビット値ではなく 8 ビット値で「0」または「1」を表しているだけです。また、操作によっては、文字列のケースが扱いにくくなる可能性があります。したがって、アルゴリズムについてさらに情報を提供していただければ、より多くのフィードバックを提供できるかもしれません. 私自身、整数 (ビットセット) の一部として個々のビットが好きです。

于 2009-07-09T05:22:54.197 に答える
0

集団のメンバーごとにクラスを作成することをお勧めします。これにより、メンバーに関連するすべての関数を実際のデータで適切にラップされた同じ場所に保持できるため、物事が大幅に簡素化されます。

「bool の配列」が必要な場合は、染色体の数に応じて、1 つまたは複数の int を使用することをお勧めします (次に、マスクとビットごとの操作を使用して各ビットにアクセス (変更/反転) します)。

母集団メンバーの配列だけでは母集団に単純に追加できないため、私は通常、母集団にある種のコレクション クラスを使用しました。ある種の動的リストを実装することをお勧めします (ArrayList に精通している場合は、それが良い例です)。

上記のレシピを使用して、遺伝的アルゴリズムで大きな成功を収めました。メンバー クラスを適切に準備すれば、物事が本当に単純化され、データ構造を心配する代わりに、より優れた遺伝的アルゴリズムのコーディングに集中できるようになります。

于 2009-07-09T06:26:19.797 に答える