3

私の問題(カレッジプロジェクト)に合わせてカスタマイズされた遺伝的アルゴリズムを実装する必要があります。最初のバージョンでは、短い行列(母集団あたりのビット数xビット)としてコード化されています。C++での遺伝的アルゴリズムのための最善のデータ構造?

私は短く宣言しているので、「0」と「1」の値しか使用していないので、それは悪いデザインでしたが、プロトタイプであり、意図したとおりに動作しました。新しい、改良されたバージョンを開発する。パフォーマンスはここで重要ですが、シンプルさも高く評価されています。

私は周りの研究と思い付いた:染色体について

: - ベクトル(ベクトルはブールのために最適化されているように見える) - - BOOL の配列 - ( "0100100010" のような)Stringクラスビットセット

と人口のために(最も自然なものを音): - Cアレイ[] - ベクター - キュー

私はCのためのベクトルを選択するように傾斜していますhromossomeとpopのための配列、しかし私は主題についての経験を持つ人の意見が欲しいです。

ありがとうございます!

答えて

7

人口と遺伝子にランダムアクセスしたいと思っています。パフォーマンスは重要だと私は実行速度として解釈します。したがって、染色体にはvector<>、遺伝子にはvector<char>を使用するのが最良でしょう。 vector<char>の理由は、bitset<>vector<bool>がメモリ消費に最適化されているため、速度が遅いからです。 vector<char>は、x8メモリのコストで高速化します(char =システム上のバイトと仮定します)。だからスピードが必要な場合は、vector<char>に行ってください。メモリ消費量が最も重要な場合は、vector<bool>またはbitset<>を使用します。 bitset<>はここでは自然な選択と思われますが、ビット数に基づいてテンプレート化されています。つまり、a)遺伝子の数はコンパイル時に固定され、知られていなければなりません-no)とb)異なるサイズを使用すると、使用するbitsetメソッド(インライン展開では無効になる可能性があります)のそれぞれのサイズがbitsetの1つのコピー、つまりコードが肥大化します。全体的に、私はvector<bool>が望ましくない場合は、あなたにとってより良いと思います。vector<char>

vector<char>の美学について心配している場合はtypedef char gene;とし、より自然に見えるvector<gene>を使用してください。

stringvector<char>と似ていますが、扱いにくいです。

1

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

考えてみるといいツールです。このライブラリをダウンロードし、最初に使用することをお勧めします。これは主要なコンパイラで動作します。 UNIXの亜種で動作します。すべてのソースコードを持っています。

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

彼らはオブジェクトなので、あなたがなどなどビット配列に木に構造に実数に整数から簡単にDNAのプレゼンテーションは変更することができ

あり、常に関与治療法を学んでいるが、それはそれだけの価値があります。

私はそれを使って何千ものニューラルネットを生成し、簡単なフィットネス機能でそれらを取り除き、実際にそれらを実行します。それは本当にあなたがする必要がある操作の種類に依存

galibあなたは(あなたがそこに良いものを持っているようだkingchris外部ライブラリをしたい場合)は、この自分をコーディングしたいと仮定すると、

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

+0

http://www.codeproject.com/KB/recipes/geneticlibrary.aspx – AngryWhenHungry

+0

も興味深いです。しかし私は今私が知っている悪魔に固執するでしょう。乾杯 – kingchris

0

。メモリの面で最大の利点を得るためには、任意の整数型を使用し、ビットマスクなどを使って個々のビットを設定/操作することができます。このアプローチは、使いやすさの点で最適ではない可能性があります...上記の文字列の例ただし、ここでも短所と大きく異なるわけではありませんが、ここでは16ビット値ではなく8ビット値で '0'または '1'のいずれかを表現しています。また、操作によっては、文字列の大文字と小文字が混乱している可能性があります。だから、もしあなたがアルゴリズムに関する情報をもっと与えることができれば、より多くのフィードバックを与えることができます。自分自身は整数(ビットセット)の一部として個々のビットを気に入っていますが、マスク、シフト、そしてそのすべての良いものに慣れていなければ、それはあなたのためには正しくないかもしれません。

0

メンバーの関連するすべての機能を同じ場所に素早く実際のデータで包み込むことができるため、人口の各メンバーにクラスを作成することをお勧めします。

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

人口のメンバーの配列だけでは人口に単純に追加することができないため、通常、人口にある種のコレクションクラスを使用しました。ダイナミックリストを実装することをお勧めします(ArrayListをよく知っていれば良い例です)。

私は上記のレシピで遺伝的アルゴリズムで大きな成功を収めました。メンバクラスを適切に準備すると、実際には単純化され、データ構造について心配するのではなく、より良い遺伝的アルゴリズムのコーディングに集中できます。

関連する問題