def __init__(self, dimensions, goomba_genomes, seed_meta, gen_len_range, gen_time=200): self.dimensions = dimensions width = dimensions[0] height = dimensions[1] self.seed_meta = seed_meta self.gen_len_range = gen_len_range self.gen_time = gen_time self.steps = 0 self.generation = 0 distrib = [TileState.Boundary] * 2 + [TileState.Dirty] + [TileState.Clean] * 7 self.state = [[choice(distrib) for _ in range(width)] for _ in range(height)] for i in range(width): self.state[i][0] = TileState.Boundary self.state[i][height - 1] = TileState.Boundary for j in range(height): self.state[0][j] = TileState.Boundary self.state[width - 1][j] = TileState.Boundary self.init_dirt_distrib = [] for y in range(height): for x in range(width): if self.state[x][y] == TileState.Dirty: self.init_dirt_distrib.append((x, y)) starts = self.start_locations(len(goomba_genomes)) self.goombas = [Goomba.from_sequences(s, p) for s, p in zip(goomba_genomes, starts)] self.top_five = self.goombas[:5] self.running = True
def __init__(self, dimensions, goomba_genomes, seed_meta, gen_len_range, gen_time=200): self.dimensions = dimensions width = dimensions[0] height = dimensions[1] self.seed_meta = seed_meta self.gen_len_range = gen_len_range self.gen_time = gen_time self.steps = 0 self.generation = 0 distrib = [TileState.Boundary]*2 + [TileState.Dirty] + [TileState.Clean]*7 self.state = [[choice(distrib) for _ in range(width)] for _ in range(height)] for i in range(width): self.state[i][0] = TileState.Boundary self.state[i][height-1] = TileState.Boundary for j in range(height): self.state[0][j] = TileState.Boundary self.state[width-1][j] = TileState.Boundary self.init_dirt_distrib = [] for y in range(height): for x in range(width): if self.state[x][y] == TileState.Dirty: self.init_dirt_distrib.append((x, y)) starts = self.start_locations(len(goomba_genomes)) self.goombas = [Goomba.from_sequences(s, p) for s, p in zip(goomba_genomes, starts)] self.top_five = self.goombas[:5] self.running = True
def breed_pop(self): """Breed the current population, a better score rank means probably more children.""" pop_size = len(self.goombas) num_clones = ceil(pop_size * World.CLONE_BEST_FRACTION) num_bred = ceil(pop_size * World.BREED_FRACTION) num_rand = ceil(pop_size * World.NEW_RANDOM_FRACTION) # Order the population by final score ordered_pop = sorted([gmba for gmba in self.goombas], key=lambda g: g.score(), reverse=True) # The top few will be cloned into the next generation unchanged top_dogs = ordered_pop[:num_clones] new_goombas = [Goomba.from_sequences(dog.genome.sequences()) for dog in top_dogs] # The bottom fraction is thrown out entirely breeders = ordered_pop[:num_bred] # The remaining goombas breed, with a higher likelihood as they rank higher breed_weighted = dict(zip(breeders, linspace(World.REPRO_SUCCESS_RAMP, 1, len(breeders)))) breeding_pairs = weighted_choice(breed_weighted, 2 * (pop_size - (num_clones + num_rand))) for i in range(0, len(breeding_pairs), 2): new_goombas.append(breed(breeding_pairs[i], breeding_pairs[i + 1])) for i in range(num_rand): new_goombas.append(Goomba(Genome.random_coding(self.seed_meta, randrange(*self.gen_len_range)))) starts = self.start_locations(len(new_goombas)) for gmba, pos in zip(new_goombas, starts): gmba.pos = pos self.goombas = new_goombas