2012-03-28 13 views
3

私はPythonでGAを実装しており、1と0のシーケンスを格納する必要があるので、データをバイナリとして表現しています。そのための最良のデータ構造は何ですか?単純な文字列ですか?Pythonの遺伝的アルゴリズムのデータ型はどれですか?

+0

「長い」または「int」のリストがより賢明に聞こえます。 –

+0

その上で突然変異や組み換えなどの操作を実行するのは簡単ですか?リストを効率的に扱っていますか? – Ingo

+0

私はちょうどあなたがビットの任意の挿入/削除が必要な場合は、リンクリスト( 'collections.deque')を使うべきでしょう。あなたのデータ構造に必要な操作に関する情報を書くことができますか?これは、Pythonを知っていて、利用可能なデータ構造を知っていて、遺伝については何も知らない人にとっては役に立ちます:) –

答えて

0

私は弦をつけるのが良い考えだと思います。文字列を簡単に切り分けることができます。それらをリストとして処理する必要がある場合は、 "list(str)"で変換できます。リストを作成したら、それを変更して "'' .join(lst)"を使って文字列に戻すことができます。

個人的には、長いか別の整数型をビットとして格納することはありません。それはより効率的なスペースかもしれませんが、あなたが組換えをしたいときにデータを扱うことの頭痛はかなりあります。突然変異がビット反転以外のものであれば突然変異も同様に問題となる。さらに、コードを読むのがずっと難しくなります。

ちょうど私の2セントです。それがあなたを助けることを願っています。

5

染色体が固定長のビットストリングの場合は、配列の代わりにNumpyの配列とベクター化された操作を使用することを検討してください。これらはPythonのリストよりはるかに高速かもしれません。例えば、1点交叉は、あなたがnumpyのを使用したくない場合は、文字列はかなり適切なようだ

def crossover(a, b): 
    """Return new individual by combining parents a and b 
     with random crossover point""" 
    c = np.empty(a.shape, dtype=bool) 
    k = np.random.randint(a.shape[0]) 
    c[:k] = a[:k] 
    c[k:] = b[k:] 
    return c 

で行うことができます。実際の要素ではなく要素へのポインタを格納するリストよりはるかにコンパクトです。

最後に、Pyevolveが染色体をどのように表しているかを見てください。それはNumpyを使用することでそうするようです。

+2

[DEAP](http://deap.googlecode.com)と[ecspy]( http://ecspy.googlecode.com)、まだ積極的に開発されているという利点があります。 – CmdNtrf

0

bitarrayを試すことができます。 またはbuffersでプレーできます。

関連する問題