我使用了一些NEAT算法来为像Flappy Bird这样的简单游戏编写自己的AI。一切运行正常,我知道发生了什么。问题是我不知道如何处理结果。AI学到了一些东西,我想保存这些进展。YouTube博主TechwithTim提到可以使用pickle来保存,这对我来说是有效的。我甚至可以从文件中加载它,但之后就不知道该怎么做了。我不知道接下来该怎么做才能让一只鸟利用之前那些鸟玩游戏的知识来玩游戏。
保存代码如下
winner = p.run(game,50)with open("winner.pkl", "wb") as f: pickle.dump(winner, f) f.close()
加载代码如下:
with open("winner.pkl", "wb") as f: genome = pickle.load(f)
使用时
print(type(genome))
输出为
<class "neat.genome.DefaultGenome">
回答:
我认为你提供的代码不是你自己写的,你可能是在按照某个教程进行操作。代码质量很低,注释形式的文档几乎不存在,变量命名也不是英文。如果是你写的,对于初学者来说完全可以接受。实际上,这甚至令人印象深刻。不过,特别是对于初学者的教程,我强烈建议寻找更详细和有文档说明的教程。
话虽如此,以下是你需要添加到项目中的代码,以便重播保存的基因组:
def replay_genome(config_path, genome_path="winner.pkl"): # 加载所需的NEAT配置 config = neat.config.Config(neat.DefaultGenome, neat.DefaultReproduction, neat.DefaultSpeciesSet, neat.DefaultStagnation, config_path) # 解封保存的赢家 with open(genome_path, "rb") as f: genome = pickle.load(f) # 将加载的基因组转换为所需的数据结构 genomes = [(1, genome)] # 仅使用加载的基因组调用游戏 game(genomes, config)
显然,由于代码质量较低,我无法理解到足以提供一个干净的重播代码的程度。因此,代码只是简单地重用现有的游戏代码来训练种群,尽管在这种情况下,种群仅由加载的基因组组成。
无耻的推广:如果你想了解更多关于神经进化的知识,请看这里:https://towardsdatascience.com/9068f532f7f7