gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:20:55 25 4
gpt4 key购买 nike

我正在研究基于 NEAT algorithm 的神经网络学习演奏 Atari Breakout在 Python 2.7 中进行克隆,我的所有部分都可以正常工作,但我认为可以通过更好的算法来计算物种适应度来大大改进进化。

神经网络的输入是:

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

输出是:

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

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

  • breakout_model.score - int:物种所玩游戏的最终得分
  • breakout_model.num_times_hit_paddle - int: Racket 击中球的次数
  • breakout_model.hits_per_life - int: Racket 击中球的次数per life,以列表的形式;例如第一个元素是第一个生命的值(value),第二个元素是第二个生命的值(value),依此类推直到4
  • breakout_model.avg_paddle_offset_from_ball - decimal: 球与 Racket 中心在 X 方向上的平均直线距离
  • breakout_model.avg_paddle_offset_from_center - decimal:框架中心到桨中心的X方向平均直线距离
  • breakout_model.time - int:游戏的总持续时间,以帧为单位
  • breakout_model.stale - boolean:游戏是否因过时而被人为终止(例如,球被卡住直接垂直弹跳, Racket 不动)

如果您认为我需要有关游戏最终状态的更多数据,而不仅仅是这些,我可能会实现一种非常容易获得它的方法。

这是我目前的适应度计算,我认为这不是很好:

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 分会对健身产生轻微的负面影响?
  • Racket 每次击球的次数应该有一些效果,但贡献/重量没有那么显着。例如如果这个数字是 0,那么它在那段时间里甚至根本没有真正尝试过击球,所以它应该有负面影响
  • Racket 击球的次数也应该有一定的影响,它的贡献应该以得分为基础。例如如果没有多次击球,也没有得到多少分,那应该会有很大的负面影响;如果击球次数不多,但得分很高,那应该会有很大的积极作用。总的来说,(我认为)这个值越接近游戏得分,这个值对适应度的贡献/权重就越小
  • 框架中心和桨叶中心之间在 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

(旁白:我没有包括“距画面中心的距离”,因为我认为那是作弊;如果保持在中心附近是最大化游戏效率的好方法,那么智能体应该自己学习。如果您将所有智能都潜入健身功能,那么您的智能体根本就不是智能。)

关于python - 需要帮助设计基于 NEAT 算法的神经网络的适应度评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40875553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com