## Evolutionary Demo ## Doug Blank, Emergence 2006 ## edited to adjust fitness function to account for correct characters in a row from pyrobot.brain.ga import * trials = 15 #KM old = 0 #KM new = 0 #KM phrase = "evolutionary systems are great methods to search a space" size = len(phrase) class PhraseGAold(GA): def fitnessFunction(self, i): sum = 0 for c in range(len(self.pop.individuals[i].genotype)): if self.pop.individuals[i].genotype[c] == phrase[c]: sum += 1 return float(sum) / len(self.pop.individuals[i].genotype) def isDone(self): print "Best:", self.pop.bestMember.display() return (phrase == string.join(self.pop.bestMember.genotype, "")) class PhraseGAnew(GA): def fitnessFunction(self, i): sum = 0 inrow = 0 #KM - number in a row for c in range(len(self.pop.individuals[i].genotype)): if self.pop.individuals[i].genotype[c] == phrase[c]: inrow += 1 #KM sum += inrow #KM else: #KM inrow = 0 #KM return float(sum) / len(self.pop.individuals[i].genotype) def isDone(self): print "Best:", self.pop.bestMember.display() return (phrase == string.join(self.pop.bestMember.genotype, "")) # loop once for each trial, testing old & new, and keeping for each a # running total of the number of generations required to find phrase for i in range (trials): ga1 = PhraseGAold(Population(300, Gene, size=size, mode='char', verbose=1, elitePercent = .1, crossoverPoints = 2), mutationRate=0.06, crossoverRate=0.6, verbose=1, maxGeneration=0) ga1.evolve() old += ga1.generation ga2 = PhraseGAnew(Population(300, Gene, size=size, mode='char', verbose=1, elitePercent = .1, crossoverPoints = 2), mutationRate=0.06, crossoverRate=0.6, verbose=1, maxGeneration=0) ga2.evolve() new += ga2.generation print "Average generations out of " + str(trials) + " trial runs" print "Old version: " + str(float(old / trials)) print "New version: " + str(float(new / trials))