需要帮助设计基于NEAT算法的神经网络的健身评估

时间:2016-11-29 20:51:52

标签: python algorithm python-2.7 machine-learning fitness

我正在开发一个基于NEAT algorithm的神经网络,它学习在Python 2.7中播放Atari Breakout克隆,我所有的部分都在工作,但我认为这种演变可能会很大通过更好的算法计算物种适应度进行了改进。

神经网络的输入是:

  • 桨叶中心的X坐标
  • 球心的X坐标
  • 球心的Y坐标
  • 球的dx(X中的速度)
  • 球的dy(Y中的速度)

输出结果为:

  • 向左移动球拍
  • 向右移动球拍
  • 不要移动桨

我可用于物种适应度计算的参数是:

  • 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会对健康产生轻微的负面影响吗?
  • 每次击球时击球的次数应该具有一些效果,但不具有贡献/重量的重要性。例如如果这个数字为0,那么在那一生中它甚至都没有真正尝试击球,所以它应该会产生负面影响
  • 球拍击球总数的次数也应该有一些效果,其贡献应该基于得分。例如如果它没有多次击球并且也没有得分很多,那应该会产生很大的负面影响;如果它没有多次击球,但得分高,那应该会产生显着的积极影响。总的来说,(我认为)越接近等于这个值就是游戏得分,这个值应该对健身的贡献/重量越小
  • 框架中心与桨叶中心之间X方向的平均距离应基本上鼓励桨叶的中央“静止”位置
  • 如果游戏由于陈旧而人为地结束,要么这应该产生显着的负面影响,要么它应该自动强制适应度为0.0;我不确定哪种情况会更好

我不确定如何对所有这些值进行操作,以使它们适当地影响整体适应度。

提前感谢您提供的任何帮助。

1 个答案:

答案 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

(旁白:我没有包括“距画框中心的距离”,因为我认为这是作弊;如果留在中心附近是一件好事,可以最大化游戏效率,那么代理人应该自己学习。如果你将所有智能隐藏到健身功能中,那么你的代理人根本就不聪明。)