ich habe mir überlegt das http://en.wikipedia.org/wiki/Weasel_program in python zu schreiben. Ich bekomme aber eine Fehlermeldung die ich irgendwie nicht erklären kann:
Mein Code (der Fehler ist unten):
Code: Alles auswählen
[code]#Funktionen und Parameter:
import random
target = list("METHINKS IT IS A WEASEL") #Zielsequenz wird als Liste initialisiert, um die einzelnen Elemente einfacher
#veraendern zu koennen
mutation_rate = 0.05 #Mutationsrate = 5%
num_progeny = 100 #Anzahl der Nachkommen pro Generation
mutations = "ABCDEFGHIJKLMNOPQRSTUVWXYZ " #Elemente in die Elemente von parent mutieren koennen, inklusive Leerzeichen
parent = [] #(noch) leere Zufaellige Startsequenz
for i in range(len(target)): #Die Startsequenz hat die laenge von target (=28)
parent.append(random.choice(mutations)) #random.choice gibt ein zufaelliges Element einer nicht leeren Sequenz
#Die Funktion "progeny" erzeugt 100 Nachkommen, in denen Elemente von parent mit 5% Mutationsrate zufaellig ausgetauscht werden
def progeny(parent):
current_progeny = [] #Liste aller aktuellen Nachkomme
for i in range(num_progeny): #Erzeugt 100 Nachkommen
for j in range(23):
if random.random() < mutation_rate:
mutation = random.choice(mutations) #Erzeugt zufaellige Mutation
parent[j] = mutation #Fuegt die Mutation in parent ein
prog = parent
current_progeny.append(prog) #Fuegt die mutierte Sequenz in die Liste der aktuellen Nachkommen
else:
prog = parent
current_progeny.append(prog) #Fuegt die nicht mutierte Sequenz in die Liste der aktuellen Nachkommen
return current_progeny
#Die Funktion "fitness" gibt einen Score für den Vergleich von progeny und target, die beste Sequenz wird ausgewaehlt
def fitness(current_progeny, target):
for i in range(len(current_progeny)): #Suche jede Sequenz in current_progeny
optimized_difference = len(target) +1
differences = 0
test_progeny = current_progeny[i] #setze test_progeny gleich Element i in current_progeny
for i in range(len(target)):
if test_progeny[i] != target[i]: #wenn das Element von test_progeny und target nicht uebereinstimmen, erhoehe differences
differences += 1
if differences < optimized_difference:
optimized_difference = differences
fittest_progeny = progeny #finde beste Sequenz
return fittest_progeny
#Programm:
num_iterations = 0
while target != progeny: #Sobald alle 28 Elemente gleich sind sind wird abgebrochen
num_iterations += 1
prog = progeny(parent)
parent = fitness(prog, target)
print ("Sequenz:", parent)
Der Error:
Code: Alles auswählen
Sequenz: <function progeny at 0x02952930>
Traceback (most recent call last):
File "C:\Users\Stefan\Desktop\Python\weasel.py", line 58, in <module>
parent = fitness(prog, target)
File "C:\Users\Stefan\Desktop\Python\weasel.py", line 43, in fitness
if test_progeny[i] != target[i]:
TypeError: 'function' object is not subscriptable
Danke schonmal für evtl. Hilfe
€: Mal den code gehighlighted (was ein wort^^). Sry wenn der Code etwas lang ist, aber ich habe mal d s ganze programm gespostet, weil ich davon ausgehe später noch ein oder zwei Fragen zu haben