如何使用 NEAT for Icy Tower 机器人选择良好的输入和适应度函数以取得良好的结果

数据挖掘 Python 神经网络 遗传算法 进化算法
2022-02-22 17:07:34

我正在尝试为著名的“冰塔”游戏制作一个机器人。我使用 pygame 重建了游戏,并尝试使用Python-NEAT构建机器人。

每一代都有 70 个角色试图跳到下一个平台并增加他们的适应度。现在适应度是他们跳的平台数量,每个平台给+10。

例子

我面临的问题是机器人在 1000 代之后学习不够好,最好的分数在 200 左右(即使在最初的几代人中,它也可能错误地达到 200。200 意味着 20 个平台,这不是很多) .

当我看到跳跃的角色时,看起来他们只是总是向左或向右跳跃,而不是故意瞄准下一个平台。

我尝试了几种输入配置以使机器人性能更好。但没有任何帮助。

这些是我试图弄乱的输入:

  • pos.x, pos.y
  • 速度.x,速度.y
  • isOnPlatform (bool)
  • [plat.x, plat.y, plat.width](3-7 个下一个平台位置列表)
  • [prev.x, prev.y](前 2-6 个字符位置)

我对神经进化不是很精通,我可能做错了什么。很高兴您能解释是什么导致机器人如此糟糕,或者是什么没有帮助他正确学习。

虽然我认为适应度函数和输入应该是我附加 python-NEAT 配置文件的唯一问题。

[NEAT]
fitness_criterion     = max
fitness_threshold     = 10000
pop_size              = 70
reset_on_extinction   = False

[DefaultGenome]
# node activation options
activation_default      = tanh
activation_mutate_rate  = 0.0
activation_options      = tanh

# node aggregation options
aggregation_default     = sum
aggregation_mutate_rate = 0.0
aggregation_options     = sum

# node bias options
bias_init_mean          = 0.0
bias_init_stdev         = 1.0
bias_max_value          = 30.0
bias_min_value          = -30.0
bias_mutate_power       = 0.5
bias_mutate_rate        = 0.7
bias_replace_rate       = 0.1

# genome compatibility options
compatibility_disjoint_coefficient = 1.0
compatibility_weight_coefficient   = 0.5

# connection add/remove rates
conn_add_prob           = 0.5
conn_delete_prob        = 0.5

# connection enable options
enabled_default         = True
enabled_mutate_rate     = 0.01

feed_forward            = True
initial_connection      = full

# node add/remove rates
node_add_prob           = 0.2
node_delete_prob        = 0.2

# network parameters
num_hidden              = 6
num_inputs              = 11
num_outputs             = 3

# node response options
response_init_mean      = 1.0
response_init_stdev     = 0.0
response_max_value      = 30.0
response_min_value      = -30.0
response_mutate_power   = 0.0
response_mutate_rate    = 0.0
response_replace_rate   = 0.0

# connection weight options
weight_init_mean        = 0.0
weight_init_stdev       = 1.0
weight_max_value        = 30
weight_min_value        = -30
weight_mutate_power     = 0.5
weight_mutate_rate      = 0.8
weight_replace_rate     = 0.1

[DefaultSpeciesSet]
compatibility_threshold = 3.0

[DefaultStagnation]
species_fitness_func = max
max_stagnation       = 3
species_elitism      = 2

[DefaultReproduction]
elitism            = 3
survival_threshold = 0.2
  • 注 1:之前的角色位置是上一帧的位置,如果游戏以 60 fps 运行,之前的位置与当前的位置并没有太大的不同......

  • ..注2:游戏分数比在平台上跳跃要复杂一些,机器人也应该因为可以让他跳得更高的连击而获得奖励。连击系统已经实现,但我首先想看到机器人在学习跳跃连击之前瞄准下一个平台。

1个回答

最初的问题可能过于复杂,神经进化无法学习。您可以使用更简单的版本进行训练,然后渐进式使示例变得更加困难。这通常称为课程学习。