Python 需要帮助为基于神经网络的整洁算法设计适应度评估吗
我正在研究一个基于的神经网络,它可以学习在Python 2.7中扮演克隆人,我已经完成了所有的工作,但是我认为如果有一个更好的算法来计算物种适应度,进化会大大改进 神经网络的输入为: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
- 桨叶中心的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.终身击球次数
:以列表形式显示的桨叶终身击球次数;e、 g.第一个元素是第一次使用寿命的值,第二个元素是第二次使用寿命的值,依此类推至4int
-breakout\u模型。球拍与球的平均偏移量
:球与球拍中心在X方向上的平均线性距离decimal
-breakout\u模型。桨距桨中心的平均偏移量
:框架中心和桨中心之间X方向上的平均线性距离decimal
-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排