需要帮助设计一个基于算法的神经网络的适应度评估吗

2024-05-19 00:21:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个基于NEAT algorithm的神经网络,它学习在Python2.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分应该会对健康产生轻微的负面影响?在
  • 每一次划桨击球的次数应该有一些效果,但对贡献/重量的影响不那么显著。e、 如果这个数字在生命中没有,那么它应该是负的
  • 桨叶击球次数对总击球次数也有一定影响,其贡献应以得分为依据。e、 g.如果它没有多次击中球,也没有得到很多分,这应该有一个显著的负面影响;如果它没有击中球多次,但得分很高,这应该有一个显著的积极影响。总的来说,(I认为)这个值越接近游戏得分,这个值对健康的贡献/权重就越小
  • 在X方向上,框架中心和桨叶中心之间的平均距离应基本上鼓励桨叶处于中心“静止”位置
  • 如果游戏因陈腐而被人为终止,要么会产生显著的负面影响,要么会自动将适应度强制为0.0;我不确定哪种情况会更好

我不知道如何对所有这些值进行操作,以使它们适当地影响整体健康。在

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


Tags: fromself游戏model方向中心次数offset
1条回答
网友
1楼 · 发布于 2024-05-19 00:21:37

我将最小化你的适应度函数中的条件逻辑,只在那些你想将适应度得分强制为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

(旁白:我没有把“离画面中心的距离”包括在内,因为我认为这是作弊;如果保持在画面中心附近是提高游戏效率的好办法,那么经纪人应该自己去学习。如果你把所有的智慧都潜入健身功能,那么你的经纪人根本就不聪明。)

相关问题 更多 >

    热门问题