我最近完成了使用pygame和python 2.7编写自己的PACMAN游戏的代码,现在我正尝试在其之上实现NEAT算法。 为简化起见,我想首先让一个AI驱动的吃豆人在地图上四处走动,“吃”点并获得分数,而没有任何鬼影或任何东西。
我一直在尝试遵循我在网上找到的一些示例,但是它们都在健身房环境中传递,而我尝试在不使用预先构建的环境的情况下实现它。
基本上,我想让NEAT算法每代产生约50个Pacmans(我的游戏包括一个Pacman类,因此应该很容易启动)。 然后,我希望每个吃豆子都收到从所有方向到墙壁的距离列表,作为输入。列表如下所示:
[3, # the distance from the nearest wall to the right of pacman
5, # the distance from the nearest wall to the left of pacman
1, # the distance from the nearest wall up
2] # the distance from the nearest wall down
作为输出,我希望NEAT算法选择按左,右,上,下或不执行任何操作。
我目前拥有的东西:
Pacman.distance_from_walls()
函数,该函数接收一个Pacman对象,并计算每个方向上与墙壁的距离。Pacman.fitness()
函数,该函数接收一个Pacman对象并返回其当前得分(这应该用作简单的适应度函数)。我遇到的主要问题是如何使NEAT启动这50个吃豆子。
这是我到目前为止所做的-主函数接收一个“手动”生成的Pacman对象:
def main(pacman):
config = neat.Config(neat.DefaultGenome, neat.DefaultReproduction,
neat.DefaultSpeciesSet, neat.DefaultStagnation,
'config.config')
def init(pacman):
return Pacman(pacman.game_settings, pacman.Tile_Map, pacman.win) # using the given Pacman's attributes when initiating more Pacmans
config.genome_config.add_activation('pacman_init', init) # trying to tell NEAT how to generate its genomes
pop = neat.Population(config)
def eval_genomes(genomes, config):
for genome_id, genome in genomes:
done = False
net = neat.nn.RecurrentNetwork.create(genome, config)
while not done:
nn_output = net.activate(genome.distances_from_walls())
print nn_output
keyboard.press(nn_output) # using pynput to do stuff
keyboard.release(nn_output)
current_fitness = genome.fitness() # using Pacman.fitness() to get current score
if current_fitness >= 120: # 120 points is enough...
done = True
print "success!"
基本上,我希望for循环中的每个“基因组”都是一个Pacman对象,因此我可以使用Pacman的功能(例如 distance_from_walls 和 fitness )。 当前,我收到一个错误:
AttributeError: 'DefaultGenome' object has no attribute 'distances_from_walls'
任何人都知道该怎么做(或向我推荐相关资源...)?不胜感激!