Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from random import choice, randint
- OPLIST = [lambda x, y: x + y,
- lambda x, y: x - y,
- lambda x, y: x * y
- ]
- OPTRANS = ['add', 'sub', 'mul']
- class Entity:
- def __init__(self, size, desiredValue):
- self.desiredValue = desiredValue
- self.genomeX = [choice(OPLIST) for _ in range(size)]
- self.genomeY = [randint(0, 10) for _ in range(size)]
- for op, val in zip(self.genomeX, self.genomeY):
- print(OPTRANS[OPLIST.index(op)],val)
- def sequence(self):
- value = 0
- for op, val in zip(self.genomeX, self.genomeY):
- try:
- value = op(value, val)
- except ZeroDivisionError:
- value = value
- fitness = abs(self.desiredValue - value)
- return (value, fitness)
- def evolve(self, size, runs):
- _, startingFitness = self.sequence()
- print('Starting',runs,'runs of evolution @',size,'stepsize.\nStarting with a fitness of:',startingFitness)
- j = 0
- fitness = 1
- for _ in range(runs):
- if fitness == 0: break
- j += 1
- for val, i in zip(self.genomeY, range(len(self.genomeY))):
- _, baseFitness = self.sequence()
- if baseFitness > 0:
- self.genomeY[i] += size
- _, fitness = self.sequence()
- if fitness > baseFitness:
- self.genomeY[i] -= size * 2
- _, newFitness = self.sequence()
- if newFitness > fitness:
- self.genomeY[i] += size
- _, endFitness = self.sequence()
- print('Ended with a fitness of:',endFitness,'after',j,'runs.\nPrinting genome below:')
- for op, val in zip(self.genomeX, self.genomeY):
- print(OPTRANS[OPLIST.index(op)],val)
- e = Entity(10, 1966)
- e.evolve(1, 10000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement