2017-07-17 7 views
0

Ich muss eine Liste von Organismen nach Fitness sortieren. Das ist wahrscheinlich die einfachste Sache, aber ich habe Probleme. Super Amateur hier.Implementieren Genetischer Algorithmen in Python: Sortieren einer Liste mit Fitness

Dies ist mein Code:

import random as randint 

pop_size = int(raw_input('Enter a population size:')) 
length = int(raw_input('Enter an orgnaism length:')) 

for i in range(pop_size): 
    org = [] 
    for a in range(length): 
     org.append(randint.randint(0,1)) 
    print org 
    fitness = sum(org) 

print sorted(org, key=fitness) 

ich den Fehler:

Traceback (most recent call last): 
    File "<stdin>", line 16, in <module> 
TypeError: 'int' object is not callable 

Eine Erklärung wirklich hilfreich :)

bearbeiten würde: Dies ist Python 2.7.2

+0

wollen Sie eine Liste von Listen sortiert nach der Summe ihrer Werte? In Ihrem Code überschreiben Sie die Organisationsliste mehrmals und versuchen dann nur, die Liste aus der letzten Iteration zu drucken. – SuperShoot

+0

Ja, ich brauche eine Liste von Listen sortiert nach ihren Werten – tony

+0

Überprüfen Sie meine Antwort, um zu sehen, ob das ist, was Sie meinen. – SuperShoot

Antwort

0

Das Schlüsselwort-Argument key muss eine Funktion sein. Also, wenn Sie eine Liste von Dicts hätten, würden Sie etwas wie fitness = lambda x: x['fitness'] verwenden, um die Dicts durch den Schlüssel fitness zu sortieren. Vielleicht ist es auch nur ein Fehler beim Kopieren/Einfügen, aber Sie definieren die Fitness jedes Mal neu, wenn Sie die Schleife durchlaufen.

+0

Muss ich Wörterbücher verwenden oder kann ich eine Liste verwenden? – tony

+0

Sie können eine Liste von Listen verwenden, wenn Sie möchten. 'list.sort (key = lambda x: x [1])' Oder wirklich eine Liste von allem, solange Sie den Schlüssel zum Sortieren nach einer aufrufbaren Funktion wie dieser aufrufen. Ein anderes Beispiel für eine aufrufbare Funktion (die hier nicht funktionieren würde) ist "datetime.now". –

+0

org.sort (key = Lambda-Fitness: Fitness [1]) So? – tony

1

Sie nicht die Listen in jeder Iteration durch die Populationsgröße erzeugt sammeln:

import random as randint 

pop_size = int(input('Enter a population size:')) 
length = int(input('Enter an orgnaism length:')) 

orgs = [] 
for i in range(pop_size): 
    org = [] 
    for a in range(length): 
     org.append(randint.randint(0,1)) 
    orgs.append(org) 

print sorted(orgs, key=sum) 

Dies kann etwas sauberer mit einer Liste Verständnis:

import random as randint 

pop_size = int(input('Enter a population size:')) 
length = int(input('Enter an orgnaism length:')) 

orgs = [[randint.randint(0,1) for a in range(length)] for i in range(pop_size)] 

print sorted(orgs, key=sum) 
Verwandte Themen