繁体   English   中英

需要帮助设计基于NEAT算法的神经网络的适应性评估

[英]Need help designing fitness evaluation for a NEAT algorithm-based neural network

我正在研究一个基于NEAT算法的神经网络,该算法学习如何在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; 我不确定哪种情况会更好

我不确定如何使用所有这些值来使它们适当地影响整体适应性。

在此先感谢您提供的任何帮助。

我将使适应度函数中的条件逻辑最小化,仅在您希望将适应度得分强制为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM