Как запустить несколько геномов одновременно в Pygame с аккуратным Python? - PullRequest
0 голосов
/ 24 апреля 2019

Я создал скрипт, который играет в простую игру в pygame с аккуратным python, но он может запускать только один геном за один раз, что очень медленно. Кто-нибудь знает, как я могу запустить несколько геномов в Pygame одновременно?

Сценарий запускает игру, и каждый кадр алгоритм NEAT решает, основываясь на состоянии, в каком направлении должен двигаться персонаж.

Я пытался использовать

pe = neat.ParallelEvaluator(4, run)
winner = p.run(pe.evaluate,10)

но он не открывает окна пигмеев и застревает в поколении 0.

def eval_genomes(genomes, config):


    for genome_id, genome in genomes:

        net = neat.nn.recurrent.RecurrentNetwork.create(genome, config)

        current_max_fitness = 0
        fitness_current = 0

        state = [random.randint(0,100),random.randint(0,100),random.randint(0,100),0,0]
        for x in range(100):
            nnOutput = net.activate(state)
            state, rew = takeAction(nnOutput.index(max(nnOutput)),state,x,genome_id)
            fitness_current += rew

            if fitness_current > current_max_fitness:
                current_max_fitness = fitness_current                
            genome.fitness = fitness_current


def run(genomes,config):

    for genome_id, genome in genomes:

        net = neat.nn.recurrent.RecurrentNetwork.create(genome, config)
        current_max_fitness = 0
        fitness_current = 0

        pygame.init()

        screen = pygame.display.set_mode((800, 600))
        allFood = []

        player = Player(100,20)
        for x in range(10):
            x = Food(random.randint(0,800),random.randint(0,600))
            allFood.append(x)


        allSprites = [player]

        clock = pygame.time.Clock()
        running = True


        for x in range(200):
            pygame.event.get()



            screen.fill((255, 255, 255))

            for entity in allSprites+allFood:
                entity.draw(screen)

            allFood, reward = player.hitObject(allFood)

            start = player.closest(allFood)[2]

            state = [player.getPosition()[0],player.getPosition()[1], player.closest(allFood)[0], player.closest(allFood)[1], player.closest(allFood)[2]]
            nnOutput = net.activate(state)

            player.takeAction(nnOutput.index(max(nnOutput)))

            end = player.closest(allFood)[2]

            fitness_current += start-end + reward

            if fitness_current > current_max_fitness:
                current_max_fitness = fitness_current                
            genome.fitness = fitness_current

            pygame.display.update()

            clock.tick(60)

            if player.getPosition()[0] < 0 or player.getPosition()[1] < 0:
                break




config = neat.Config(neat.DefaultGenome, neat.DefaultReproduction,
                         neat.DefaultSpeciesSet, neat.DefaultStagnation,
                         'config-feedforward')


p = neat.Population(config)

p.add_reporter(neat.StdOutReporter(True))
stats = neat.StatisticsReporter()
p.add_reporter(stats)
p.add_reporter(neat.Checkpointer(100))

winner = p.run(run,1000)
...