SHARE
TWEET

Genetic Hello World

Sp3000 Sep 9th, 2014 7 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import random
  2. from collections import namedtuple
  3.  
  4. def evolve(initialise_population_f, fitness_f, breed_f, num_generations=100):
  5.     """
  6.    initialise_population: Returns an initial population represented as a list
  7.    fitness_f            : Fitness function
  8.    breed_f              : Takes two elements and breeds them, possibly introducing mutations
  9.    num_generations      : Number of generations to run the evolver for
  10.    """
  11.  
  12.     Individual = namedtuple("Individual", ["fitness", "gene"])
  13.  
  14.     population = [Individual(fitness_f(x), x) for x in initialise_population_f()]
  15.     pop_size = len(population)
  16.  
  17.     def rand_index():
  18.         return max(pop_size - 1, int(pop_size * random.triangular(0, 1, 1)))
  19.  
  20.     for generation in range(num_generations):
  21.         new_population = []
  22.         population.sort()
  23.  
  24.         for i in range(pop_size):
  25.             index1 = rand_index()
  26.             index2 = rand_index()
  27.  
  28.             new_indiv = breed_f(population[index1].gene, population[index2].gene)
  29.             new_population.append(Individual(fitness_f(new_indiv), new_indiv))
  30.  
  31.         population = new_population
  32.        
  33.     population.sort()
  34.     return population[-1]
  35.  
  36. alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ, !"
  37.  
  38. def rand_string(n, alphabet):
  39.         return "".join([random.choice(alphabet) for i in range(n)])
  40.    
  41. def initialise_population():
  42.     return [rand_string(13, alphabet) for i in range(1000)]
  43.  
  44. def fitness_function(string):
  45.     return sum((1 if string[i] == "Hello, World!"[i] else 0) for i in range(len(string)))
  46.  
  47. def breed(string1, string2):
  48.     global alphabet
  49.    
  50.     index = random.randint(0, len(string1) - 1)
  51.     child = string1[:index] + string2[index:]
  52.  
  53.     if random.random() < 0.1:
  54.         mutation_index = random.randint(0, len(child) - 1)
  55.         child = child[:mutation_index] + random.choice(alphabet) + child[mutation_index+1:]
  56.        
  57.     return child
RAW Paste Data
Pastebin PRO Summer Special!
Get 60% OFF on Pastebin PRO accounts!
Top