我正在研究一个基于NEAT algorithm的神经网络,它学习在Python2.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或是一个大的惩罚的情况下使用它。我会决定分数的每个组成部分应该有多大的权重并乘以。负成分只会增加理解适应度函数的复杂性,没有实际的好处;模型从得分的相对差异中学习。所以我的函数版本应该是这样的:
(旁白:我没有把“离画面中心的距离”包括在内,因为我认为这是作弊;如果保持在画面中心附近是提高游戏效率的好办法,那么经纪人应该自己去学习。如果你把所有的智慧都潜入健身功能,那么你的经纪人根本就不聪明。)
相关问题 更多 >
编程相关推荐