[英]Need help designing fitness evaluation for a NEAT algorithm-based neural network
我正在研究一个基于NEAT算法的神经网络,该算法学习如何在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或较大惩罚的情况下使用它。 我只想决定分数的每个部分应具有的权重并相乘。 负数组件只会增加理解适应度函数的复杂性,而没有真正的好处。 该模型从分数的相对差异中学习。 所以我的函数版本看起来像这样:
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
(此外:我没有包括“距框架中心的距离”,因为我认为这是一种作弊;如果要保持中心位置最大化是最大化游戏效率的一件好事,那么经纪人应该自己学习这一点。所有智能都纳入适应功能,那么您的代理根本就不是智能的。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.