2012-03-28 17 views
3

Ich implementiere ein GA in Python und muss eine Folge von Einsen und Nullen speichern, also stelle ich meine Daten als Binärdateien dar. Was ist die beste Datenstruktur dafür? Eine einfache Zeichenfolge?Welche Datentypen für genetische Algorithmen in Python?

+0

Eine 'lange' oder eine Liste von' int' klingt vernünftiger. –

+0

Ist es einfach, Operationen wie Mutationen oder Rekombinationen durchzuführen? Ist das Arbeiten mit Listen effizient genug? – Ingo

+0

Ich reagierte gerade auf den Teil "Speichern Sie eine Folge von Einsen und Nullen" :) Wenn Sie ein beliebiges Einfügen/Entfernen von Bits benötigen, sollten Sie stattdessen eine verkettete Liste verwenden ('collections.deque'). Können Sie Informationen zu den erforderlichen Operationen für Ihre Datenstruktur schreiben? Dies könnte für Leute wie mich hilfreich sein, die Python und die verfügbaren Datenstrukturen kennen, aber nichts über Genetik wissen :) –

Antwort

0

Ich denke, mit den Saiten zu bleiben ist eine gute Idee. Sie können einfach Strings in Stücke hacken. Wenn Sie auf sie als Liste reagieren müssen, können Sie sie mit "list (str)" konvertieren. Sobald Sie eine Liste haben, können Sie sie ändern und mit "'. .join (lst)" in eine Zeichenkette zurückverwandeln.

Persönlich würde ich nicht einen langen oder einen anderen Integer-Typ verwenden, um als Bits zu speichern. Es kann platzsparender sein, aber die Kopfschmerzen der Arbeit mit den Daten, wenn Sie eine Rekombination durchführen möchten, wären beträchtlich. Mutationen wären ebenfalls problematisch, wenn die Mutation aus etwas anderem als einem Bit-Flip besteht. Außerdem wäre der Code viel schwerer zu lesen.

Nur meine 2 Cent. Hoffe, dass dir das hilft.

5

Wenn es sich bei Ihren Chromosomen um Bitstränge fester Länge handelt, sollten Sie anstelle von Listen Numpy Arrays und vektorisierte Operationen verwenden. Diese können viel schneller sein als Python-Listen. Z. B. kann ein-Punkt-Crossover mit

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 

Wenn Sie Numpy nicht verwenden getan werden wollen, dann Strings scheinen durchaus angebracht; Sie sind viel kompakter als Listen, die Zeiger auf Elemente statt auf tatsächliche Elemente speichern.

Schließlich, achten Sie darauf, wie Pyevolve Chromosomen darstellt; Es scheint so zu sein, wenn man Numpy benutzt.

+2

Es gibt auch [DEAP] (http://deap.googlecode.com) und [ecspy] (http://ecspy.googlecode.com), die den Vorteil haben, noch aktiv entwickelt zu werden. – CmdNtrf

0

Sie können versuchen, bitarray zu verwenden. Oder Sie können mit buffers spielen.

Verwandte Themen