Python-在Pacman Game之上实现NEAT算法

时间:2019-04-20 23:39:07

标签: python-2.7 machine-learning neural-network reinforcement-learning pacman

我最近完成了使用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算法选择按左,右,上,下或不执行任何操作。

我目前拥有的东西:

  1. 我有一个Pacman.distance_from_walls()函数,该函数接收一个Pacman对象,并计算每个方向上与墙壁的距离。
  2. 我有一个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'

任何人都知道该怎么做(或向我推荐相关资源...)?不胜感激!

0 个答案:

没有答案