我正在尝试为著名的“冰塔”游戏制作一个机器人。我使用 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:游戏分数比在平台上跳跃要复杂一些,机器人也应该因为可以让他跳得更高的连击而获得奖励。连击系统已经实现,但我首先想看到机器人在学习跳跃连击之前瞄准下一个平台。
