Advertisement
Guest User

Weasel

a guest
Jan 2nd, 2025
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.53 KB | Source Code | 0 0
  1. import string
  2. import random
  3. import itertools
  4.  
  5. # Possible genes (whole character set)
  6. charset = string.ascii_uppercase + "_"
  7.  
  8. # Number of genes (characters in the string)
  9. numGenes = 28
  10.  
  11. # Create a next generation of mutated offspring
  12. def mutate(state, numOffspring, mutationProb):
  13.     mutations = []
  14.  
  15.     for i in range(numOffspring):
  16.         mutation = ""
  17.         for j in range(numGenes):
  18.             # Will character j be mutated?
  19.             p = random.randint(1, 100)
  20.             if p<=mutationProb:
  21.                 # (Possible) Nasty bug no 1: charset NOT state (generations won't variate)
  22.                 newGene = charset[random.randint(0, len(charset)-1)]        
  23.                 mutation += newGene
  24.             else:
  25.                 mutation += state[j]                      
  26.         mutations.append(mutation)
  27.    
  28.     return mutations
  29.  
  30. # Compute Hamming distance between two strings
  31. def hamming(str1, str2):
  32.   return sum(map(str.__ne__, str1, str2))
  33.  
  34.  
  35. # Select the fittest offspring from the pool
  36. # (Live free or die - UNIX)
  37. def fittest(mutations, target):
  38.     min = numGenes+1
  39.     fittest = None
  40.  
  41.     for m in mutations:
  42.         d = hamming(m, target)
  43.         if d<min:
  44.             min = d
  45.             fittest = m                                    
  46.  
  47.     # (Possible) Nasty bug no 2: return fittest NOT m (generations won't evolve at all))
  48.     return fittest                  
  49.  
  50. # Colourise mutation based on distance from target
  51. # (We don't care about performance so light the Christmas tree)
  52. def colorise(mutation, target):
  53.     W  = '\033[0m'  # white (normal)
  54.     R  = '\033[31m' # red
  55.     G  = '\033[32m' # green
  56.  
  57.     s = ""
  58.     for i in range(len(mutation)):
  59.         if mutation[i] == target[i]:
  60.             s += G + mutation[i]
  61.         else:
  62.             s += R + mutation[i]
  63.     s += W  
  64.     return s
  65.  
  66. # While target not reached, evolve!
  67. def evolve(numOffspring, mutationProb):
  68.     cur = "".join(random.choice(charset) for _ in range(numGenes))
  69.     fin = "METHINKS_IT_IS_LIKE_A_WEASEL"
  70.    
  71.     gen = 0
  72.    
  73.     print("%4s %28s %4s" % ("Gen", "Mutation", "Dist"))
  74.     while cur != fin:
  75.         offspring = mutate(cur, numOffspring, mutationProb)
  76.         cur = fittest(offspring, fin)
  77.         gen += 1
  78.         print("%4d" % gen, colorise(cur, fin), hamming(cur, fin))
  79.  
  80.  
  81. if __name__ == "__main__":
  82.     # Number of offspring per generation
  83.     numOffspring = 100
  84.  
  85.     # Probability that a gene (character) will mutate (percent)
  86.     mutationProb = 5
  87.  
  88.     evolve(numOffspring, mutationProb)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement