#!/usr/bin/python import random ######################### Configurable options eta = 1.5 peaks = [1,4,9,16,25,36,49,64,81,100] max_generations = 10 initial_population = 25 ######################### Don't change stuff past here unless you know what you're doing fitness_array = { } print "# peaks = " + str(peaks) print "# eta = " + str(eta) print "# max_generations = " + str(max_generations) print "# COLUMNS: Generation || Number || Occurences || % of Population || Average Num Copies (fitness)" def make_fitness_array(): for spot in range(101): global eta global peaks global fitness_array shortest_distance = 999 # Just some initial value that will be erased over for peak in peaks: distance = abs(spot - peak) if distance < shortest_distance: shortest_distance = distance if shortest_distance == 0 : fitness = eta * 1.0 else: fitness = eta * (1.0 / shortest_distance) fitness_array[spot] = fitness def make_initial_population(): global initial_population population = [ ] for i in range(initial_population): spot = int(round(random.random() * 100)) population.append(spot) return population def how_many_children(): global population global fitness_array number_children = [ ] for critter in population: int_numkids = int(fitness_array[critter]) decimal_numkids = fitness_array[critter] - int_numkids; if random.random() < decimal_numkids: int_numkids = int_numkids + 1 number_children.append(int_numkids) return number_children def mutation(parent): random_number = random.random() if random_number < 0.25: # Do a negative mutation child = parent - 1 if child < 0: # So we don't go below 0 child = 0 elif random_number < 0.5: # Do a positive mutation child = parent + 1 if child > 100: # So we don't go above 100 child = 100 else: child = parent # Don't do any mutation return child def make_next_generation(): global population global numkids_to_make children = [ ] for i in range(len(population)): # We're going to make kids for every single critter (assuming they have any) for count in range(numkids_to_make[i]): # Runs for numkids >= 1 children.append( mutation(population[i]) ) return children def list2dict(list): dict = { } list.sort() for item in list: if dict.has_key(item): dict[item] += 1 else: dict[item] = 1 return dict ## Main program begins here population = [ ] make_fitness_array() population = make_initial_population() # print str(fitness_array) for generation in range(1,max_generations+1): population.sort() numkids_to_make = how_many_children() # print str(numkids_to_make) dict_population = list2dict(population) population_size = len(population) print "####### Size of Population: " + str(population_size) for critter in dict_population.keys(): percent_population = round( dict_population[critter] / float(population_size), 4) print str(generation) + "\t" + str(critter) + "\t" + str(dict_population[critter]) + "\t" + str(percent_population) + "\t" + str(fitness_array[critter]) population = make_next_generation()