2017-03-01 6 views
0

Ich benutze Python-3.x, und ich versuche, Mutation auf eine binäre Zeichenfolge zu tun, die ein Bit der Elemente von 0 auf 1 umdrehen wird oder 1 bis 0 durch gelegentliches, ich einige Methoden ausprobiert, aber hat nicht funktioniert, weiß ich nicht, wo das Problem ist:Mutation auf einer binären Zeichenfolge (genetischer Algorithmus) - Python-3.x

x=[0, 0, 0, 0, 0] 

def mutation (x, muta): 
    for i in range(len(x)): 
     if random.random() < muta: 
      x[i] = type(x[i])(not x[i]) 
    return x, 
print (x) 

der Ausgang beispielsweise sein sollte x = [0, 0, 0, 1, 0] oder x = [1, 0, 0, 0, 0] und so weiter ....

auch habe ich versucht, diese:

MUTATION_RATE = 0.5 
CHROMO_LEN = 6 
def mutate(x): 
    x = "" 
    for i in range(CHROMO_LEN): 
     if (random.random() < MUTATION_RATE): 
      if (x[i] == 1): 
       x += 0 
      else: 
       x += 1 
     else: 
      x += x[i] 
    return x 
print(x) 

bitte jede Anregung oder Beratung wird

+0

Was ist mit 'Typ (x [i]) (nicht x [i])' ..., die zwischen '1' und '0' drehen wird? –

+0

Der Wert von x [i] – azeez

+0

Aber warum machst du 'type (x [i]) (...)'? –

Antwort

0

geschätzt werden Sind Sie sicher, dass Sie die Funktion sind Aufruf vor x Druck:

def mutation(x): 
    # your code without the trailing comma 

mutation(x) 
print(x) 

In Python, eine neue Liste erstellen ist in der Regel vorzuziehen, eine alte zu mutieren. Ich würde Ihre erste Funktion wie diese (I umgewandelt, um die ganzen Zahlen booleans schreiben, weil Sie gerade sie spiegeln:

x = [False, False, False, False] 


def mutation(x, muta): 
    return [not e if random.random() < muta else e 
      for e in x] 

ändern x von wieder darauf zuweisen:

x = mutation(x, .5) 

Ihre ursprüngliche Funktion arbeitet wenn Sie das Komma nach dem return entfernen:

def mutation(x, muta): 
    for i in range(len(x)): 
     if random.random() < muta: 
      x[i] = type(x[i])(not x[i]) 
    return x 
x = [False, False, False, False] 


mutation(x, .5) 
Out[8]: [False, False, True, False] 

mutation(x, .5) 
Out[9]: [True, True, True, False] 
+0

Ich würde nicht sagen, es ist vorzuziehen, eine neue Liste zu erstellen, anstatt eine alte zu mutieren ... das hängt völlig von Ihrem Anwendungsfall ab. –

+0

Ja, es funktioniert, aber nichts ändert – azeez

+0

@ juanpa.arrivillaga Ich denke, es ist eher eine Meinung, aber wenn die Leistung ein Problem ist, schätze ich wirklich Funktionen nicht mit den Werten, die ich ohne explizite Zuweisung, wenn ich die Funktion aufrufen. – Ben

Verwandte Themen