Schreibe gerade an einem Evo Algo und brauche dafuer zufaellige "paarungen" von den features. Leider sehen meine ausgaben dann doch immer ziemlich aehnlich aus. Um es kurz zu umreissen was passiert:
Ich habe eine Menge an sog. Features (einfach ints) aus denen zufaellige Submengen erstellt werden. Dann werden diese rekombiniert um eine groessere Anzahl zu erhalten. Die besten werden behalten und diese sind dann die neue elterngeneration. und dann gehts im kreis.
Hier zur veranschaulichung das ergebnis:
zeilen mit den floats(doubles?) sind die eltern mit der Wertigkeit davor
dann kommen die Kinder
dann die mutierten Kinder
und zuletzt noch einmal die eltern damit man sie einfacher vergleichen kann.
sry fuer das riesenteil, ist nur zur veranschaulichung, man sieht aber dass rekombination und mutation staendig dieselben werte produzieren muss! hier der code:
Code: Alles auswählen
from copy import deepcopy
from random import choice
from random import random
class Recombination():
def __init__(self, lam):
self.lam = lam
self.parents = []
self.childs = []
def getrandom(self,list):
if list != []:
feature = choice(list)
list.remove(feature)
return feature
else:
return None
def deletedouble(self,list):
d = {}
if len(list)==1:
return list
for x in list: d[x]=x
list = d.values()
return list
class Random(Recombination):
def __init__(self,lam):
Recombination.__init__(self, lam)
def recombination(self, parents):
self.parents = parents
self.childs=[]
for i in range(self.lam):
parents =[]
parentlist = deepcopy(self.parents)
for k in range(2):
parents.append(self.getrandom(parentlist))
newchild=[]
parents = parents[0][1]+parents[1][1]
parents = self.deletedouble(parents)
sublen= 0
while sublen == 0:
sublen = choice(range(len(parents)+1))
newchild = []
for j in range(sublen):
newchild.append(self.getrandom(parents))
self.childs.append(newchild)
return self.childs
############### und aus nem anderen modul die mutation:################
def mutation(self):
self.mutatedchilds = []
for i in range(len(self.childs)):
mutatingchild = deepcopy(self.childs[i])
for j in range(len(mutatingchild)):
if random() <= self.mutationrate:
mutatingchild[j] = choice(self.features)
if self.addition:
if random() <= self.mutationrate:
mutatingchild.append(choice(self.features))
if self.deletion and len(mutatingchild) > 1:
if random() <= self.mutationrate:
mutatingchild.remove(choice(mutatingchild))
mutatingchild = self.deletedouble(mutatingchild)
self.mutatedchilds.append(mutatingchild)