我正在基于 NEAT算法 的神经网络上工作,学习在Python 2.7中玩一个Atari Breakout克隆版,所有的部分都已经可以工作了,但我认为通过改进物种适应性计算的算法,进化可以大大提高。
神经网络的输入包括:
- 挡板中心的X坐标 - 球的中心X坐标 - 球的中心Y坐标 - 球的dx(X轴速度) - 球的dy(Y轴速度)
输出包括:
- 向左移动挡板 - 向右移动挡板 - 不移动挡板
我可以用以下参数来计算物种适应性:
以下是我认为健身计算应该在语义上执行的内容:
神经网络的输入包括:
- 挡板中心的X坐标 - 球的中心X坐标 - 球的中心Y坐标 - 球的dx(X轴速度) - 球的dy(Y轴速度)
输出包括:
- 向左移动挡板 - 向右移动挡板 - 不移动挡板
我可以用以下参数来计算物种适应性:
breakout_model.score
-int
: 物种玩游戏的最终得分breakout_model.num_times_hit_paddle
-int
: 挡板击中球的次数breakout_model.hits_per_life
-int
: 以列表形式给出每个生命中挡板击中球的次数;例如,第一个元素是第一条命的值,第二个元素是第二条命的值,依此类推,最多有四个元素breakout_model.avg_paddle_offset_from_ball
-decimal
: 球和挡板中心在X轴方向上的平均线性距离breakout_model.avg_paddle_offset_from_center
-decimal
: 挡板中心和框架中心在X轴方向上的平均线性距离breakout_model.time
-int
: 游戏的总持续时间,以帧为单位breakout_model.stale
-boolean
: 游戏是否因为停滞不前而被人为终止(例如,球被卡住垂直弹跳且挡板不移动)
def calculate_fitness(self):
self.fitness = self.breakout_model.score
if self.breakout_model.num_times_hit_paddle != 0:
self.fitness += self.breakout_model.num_times_hit_paddle / 10
else:
self.fitness -= 0.5
if self.breakout_model.avg_paddle_offset_from_ball != 0:
self.fitness -= (1 / self.breakout_model.avg_paddle_offset_from_ball) * 100
for hits in self.breakout_model.hits_per_life:
if hits == 0:
self.fitness -= 0.2
if self.breakout_model.stale:
self.fitness = 0 - self.fitness
return self.fitness
以下是我认为健身计算应该在语义上执行的内容:
这是我认为健身计算应该进行的操作:
- 显然,分数对整体适应度的影响最大。也许分数为0会稍微对适应度产生负面影响?
- 球拍在每一条命中击打球的次数应该有一定的影响,但不应该是最重要的贡献/权重。例如,如果这个数字为0,在那一条命中它根本没有试图去打球,所以应该有一个负面影响。
- 球拍总共击打球的次数也应该有一定的影响,并且其贡献应该基于得分。例如,如果它没有多少次击打球,也没有得到很多分数,那么应该有一个显著的负面影响;如果它没有多少次击打球,但得了高分,那么应该有一个显著的正面影响。总的来说,(我认为)这个值越接近游戏得分,这个值对适应度的贡献/权重就越小。
- 球拍中心和帧中心之间的X方向平均距离应该鼓励球拍保持中心“休息”位置。
- 如果游戏由于无聊而人为结束,那么这可能会产生显著的负面影响,或者它应该自动强制适应度为0.0;我不确定哪种情况更好。
我不确定如何操作所有这些值,以使它们适当地影响整体适应度。
非常感谢您提供的任何帮助。
score / (num_paddle_hits)
是一个高比率,所以它故意错过了(至少,它会执行一些看起来像是故意错过的行为)。 - Mat Jones