PyGame学习环境和NEAT-Python

时间:2018-10-16 13:50:58

标签: python pygame

我一直在尝试使用NEAT-python库制作一种遗传算法来播放FlappyBird。我遇到了for基因组循环的问题。在基因组迭代开始后,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 :(得分:0)

今天我也做了同样的事情! :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)

这是因为在最初的几次运行中,我保存了每个基因组,并且更改目录将所有事情搞砸了。

除此之外,它可以正常工作。一旦可行,您就可以替换游戏或整个评估。

否则,请查看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循环中可能出了点问题,不是吗?