Python 需要帮助为基于神经网络的整洁算法设计适应度评估吗

Python 需要帮助为基于神经网络的整洁算法设计适应度评估吗,python,algorithm,python-2.7,machine-learning,fitness,Python,Algorithm,Python 2.7,Machine Learning,Fitness,我正在研究一个基于的神经网络,它可以学习在Python 2.7中扮演克隆人,我已经完成了所有的工作,但是我认为如果有一个更好的算法来计算物种适应度,进化会大大改进 神经网络的输入为: 桨叶中心的X坐标 球中心的X坐标 球中心的Y坐标 球的dx(以X为单位的速度) 球的dy(Y中的速度) 这些产出是: 向左移动桨 右移桨 不要移动桨叶 我可用于物种适应度计算的参数有: breakout_model.score-int:该物种所玩游戏的最终得分 breakout\u model.num\u

我正在研究一个基于的神经网络,它可以学习在Python 2.7中扮演克隆人,我已经完成了所有的工作,但是我认为如果有一个更好的算法来计算物种适应度,进化会大大改进

神经网络的输入为:

  • 桨叶中心的X坐标
  • 球中心的X坐标
  • 球中心的Y坐标
  • 球的dx(以X为单位的速度)
  • 球的dy(Y中的速度)
这些产出是:

  • 向左移动桨
  • 右移桨
  • 不要移动桨叶
我可用于物种适应度计算的参数有:

  • breakout_model.score
    -
    int
    :该物种所玩游戏的最终得分
  • breakout\u model.num\u times\u hit\u blade
    -
    int
    :球拍击球的次数
  • breakout\u model.终身击球次数
    -
    int
    :以列表形式显示的桨叶终身击球次数;e、 g.第一个元素是第一次使用寿命的值,第二个元素是第二次使用寿命的值,依此类推至4
  • breakout\u模型。球拍与球的平均偏移量
    -
    decimal
    :球与球拍中心在X方向上的平均线性距离
  • breakout\u模型。桨距桨中心的平均偏移量
    -
    decimal
    :框架中心和桨中心之间X方向上的平均线性距离
  • breakout\u model.time
    -
    int
    :游戏的总持续时间,以帧为单位
  • breakout\u 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会对健康产生轻微的负面影响
  • 划桨每一次击中球的次数应该有一定的影响,但对贡献/重量的影响不大。e、 如果这个数字是0,那么它在生命中根本就没有试着击球,所以它应该会产生负面影响
  • 球拍击中球的总次数也应有一定的影响,其贡献应基于得分。e、 g.如果它没有击中球很多次,也没有得分很多,那应该会产生显著的负面影响;如果它没有击中球很多次,但得分很高,这应该有一个显着的积极影响。总的来说,(我认为)这个值与比赛分数越接近,这个值对体能的贡献/权重就越小
  • 框架中心和桨叶中心之间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

(旁白:我没有包括“与画面中心的距离”,因为我认为这是作弊;如果为了最大限度地提高游戏效率,呆在中心附近是一件好事,那么代理应该自己学习。如果你把所有的智能都潜入健身功能中,那么你的代理根本就不聪明。)

也许健身的最佳标准如下:(得分/击球次数)-击球失误次数。也就是说,你想最大限度地提高每次击球的得分,并最大限度地减少击球失误的次数。你应该首先定义你认为“打得好”对游戏意味着什么,然后才能合理地定义适应度函数。你想按照Alex的建议最大化每次击球的得分吗?@Alex我本来就有这么简单的东西,但这导致它的行为似乎是,如果一次击球击中多个街区,它就会故意错过球,并且会陷入局部最小值;我不知道如何帮助它逃过这个最小值,所以我慢慢地开始使适应度函数变得越来越复杂,希望能解决这个问题。@mjones.udri考虑到一次击球击中多个挡块有助于最大化“每次击球得分”,而“故意错过球”则对两者都有负面影响“每击一杆得分“并尽量减少划桨失误的次数。我不太理解你所描述的行为,除非是由于某些错误。@Alex这是一个局部最小值。假设它打破了足够多的障碍,使球能够越过障碍墙,然后在障碍和天花板之间反弹几次;发生这种情况的最小桨叶撞击次数为3次(因为共有3排