Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.94 KB | None | 0 0
  1. from random import choice, randint
  2.  
  3. OPLIST = [lambda x, y: x + y,
  4.           lambda x, y: x - y,
  5.           lambda x, y: x * y
  6.           ]
  7.  
  8. OPTRANS = ['add', 'sub', 'mul']
  9.  
  10. class Entity:
  11.     def __init__(self, size, desiredValue):
  12.         self.desiredValue = desiredValue
  13.         self.genomeX = [choice(OPLIST) for _ in range(size)]
  14.         self.genomeY = [randint(0, 10) for _ in range(size)]
  15.         for op, val in zip(self.genomeX, self.genomeY):
  16.             print(OPTRANS[OPLIST.index(op)],val)
  17.  
  18.     def sequence(self):
  19.         value = 0
  20.         for op, val in zip(self.genomeX, self.genomeY):
  21.             try:
  22.                 value = op(value, val)
  23.             except ZeroDivisionError:
  24.                 value = value
  25.         fitness = abs(self.desiredValue - value)
  26.         return (value, fitness)
  27.  
  28.     def evolve(self, size, runs):
  29.         _, startingFitness = self.sequence()
  30.         print('Starting',runs,'runs of evolution @',size,'stepsize.\nStarting with a fitness of:',startingFitness)
  31.         j = 0
  32.         fitness = 1
  33.         for _ in range(runs):
  34.             if fitness == 0: break
  35.             j += 1
  36.             for val, i in zip(self.genomeY, range(len(self.genomeY))):
  37.                 _, baseFitness = self.sequence()
  38.                 if baseFitness > 0:
  39.                     self.genomeY[i] += size
  40.                     _, fitness = self.sequence()
  41.                     if fitness > baseFitness:
  42.                         self.genomeY[i] -= size * 2
  43.                         _, newFitness = self.sequence()
  44.                         if newFitness > fitness:
  45.                             self.genomeY[i] += size
  46.            
  47.         _, endFitness = self.sequence()
  48.         print('Ended with a fitness of:',endFitness,'after',j,'runs.\nPrinting genome below:')
  49.         for op, val in zip(self.genomeX, self.genomeY):
  50.             print(OPTRANS[OPLIST.index(op)],val)
  51.                        
  52. e = Entity(10, 1966)
  53.  
  54. e.evolve(1, 10000)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement