我正在开发一个基于NEAT algorithm的神经网络,它学习在Python 2.7中播放Atari Breakout克隆,我所有的部分都在工作,但我认为这种演变可能会很大通过更好的算法计算物种适应度进行了改进。
神经网络的输入是:
输出结果为:
我可用于物种适应度计算的参数是:
breakout_model.score
- int
:该物种游戏的最终得分breakout_model.num_times_hit_paddle
- int
:球拍击球的次数breakout_model.hits_per_life
- int
:球拍以球员生命球的次数,以列表的形式出现;例如第一个元素是第一个生命的值,第二个元素是第二个生命的值,依此类推,最多4个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 :(得分:1)
我会最小化您的适应度函数中的条件逻辑,仅在您想要将健身分数强制为0或重大惩罚的情况下使用它。我只想确定分数的每个分量应该具有多少权重并且相乘。负面成分只会增加理解健身功能的复杂性,没有真正的好处;模型从分数的相对差异中学习。所以我的函数版本看起来像这样:
def fitness(...):
if total_hits == 0:
return 0
return (game_score/max_score) * .7 \
+ game_score/total_hits * .2 \
+ game_score_per_life/hits_per_life * .1
(旁白:我没有包括“距画框中心的距离”,因为我认为这是作弊;如果留在中心附近是一件好事,可以最大化游戏效率,那么代理人应该自己学习。如果你将所有智能隐藏到健身功能中,那么你的代理人根本就不聪明。)