示例#1
0
文件: world.py 项目: zyzek/goombas
    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
示例#2
0
文件: world.py 项目: zyzek/goombas
    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
示例#3
0
文件: world.py 项目: zyzek/goombas
    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
示例#4
0
文件: world.py 项目: zyzek/goombas
    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