我一直在尝试使用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
答案 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循环中可能出了点问题,不是吗?