PyGame Learning Environment и NEAT-Python - PullRequest
0 голосов
/ 16 октября 2018

Я пытался создать генетический алгоритм для воспроизведения FlappyBird, используя библиотеку NEAT-python.У меня были проблемы, когда цикл за геномами.После итерации по геномам цикл for завершает действие только для одной птицы вместо продолжения и перезапуска игры для нового генома.вот функция, где я обрабатываю это и как я инициализирую игровую среду.

game = FlappyBird()
p = PLE(game, fps=30, display_screen=True, force_fps=False)
p.init()

def eval_genomes(genomes, config):

    for genome_id, genome in genomes:
        p.reset_game()
        net = FeedForwardNetwork.create(genome, config)
        genome.set_actions(p.getActionSet())
        genome.fitness = 0

        while not p.game_over():
            game_state = game.getGameState()
            decision = genome.play(net, game_state)
            if decision == 1:
                p.act(0)

        else:
            genome.fitness = p.score()
            genome.is_dead = True

1 Ответ

0 голосов
/ 29 декабря 2018

Только сегодня я сделал то же самое!: D

С той разницей, что это сработало для меня ....

Вы можете взглянуть на следующий репозиторий на github.https://github.com/rsk2327/NEAT_FlappyBird

Я не думаю, что он больше не обновляется.но в этом нет необходимости.Единственное, что мне пришлось изменить в его коде, это удалить все: "/ home / roshan / Documents / FlappyBird /".Вы можете просто оставить их и поместить все ресурсы в одну папку.

Кроме того, я изменил дамп победителя следующим образом:

#outputDir = 'bestGenomes/'
#os.chdir(outputDir)
#serialNo = len(os.listdir(outputDir))+1
#outputFile = open(str(serialNo)+'_'+str(int(MAX_FITNESS))+'.p','wb' )
outputFile = 'bestGenome/winner.p'
pickle.dump(winner, outputFile)

Это потому, что в первые несколько прогонов я сохранял каждый геном, а смена директории все испортило.

Кроме того, он работает нормально.как только он заработает, вы можете просто заменить игру или весь eval.

Иначе, взгляните на примеры Neat-python.В примере с минимальным развитием все, что им нужно, это следовать коду, и он работает для каждого генома.

def eval_genomes(genomes, config):
    for genome_id, genome in genomes:
        genome.fitness = 4.0
        net = neat.nn.FeedForwardNetwork.create(genome, config)
        for xi, xo in zip(xor_inputs, xor_outputs):
            output = net.activate(xi)
            genome.fitness -= (output[0] - xo[0]) ** 2

Хотя я должен сказать, что для меня это выглядит функционально одинаково.Так что, вероятно, что-то не так в цикле while, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...