我正在研究一个基于在python 2.7中学习播放一个克隆的神经网络,我已经完成了所有工作,但是我认为用一个更好的算法来计算物种适合度可以大大改进进化过程。
神经网络的输入是:
桨叶中心的X坐标
球中心的X坐标
球中心的Y坐标
球的dx(速度x)
球的dy(y中的速度)
输出为:
向左移动挡板
向右移动挡板
不要移动桨叶
我可用于物种适应度计算的参数有:
物种玩游戏的最后得分
桨击球的次数breakout_model.score
-int
:以列表的形式,每个生命中桨击球的次数;例如,第一个元素是第一个生命的值,第二个元素是第二个生命的值,等等,最多4次
球拍和球拍中心之间X方向的平均线性距离breakout_model.num_times_hit_paddle
-int
:框架中心和桨叶中心之间x方向的平均线性距离
游戏总持续时间,以帧为单位breakout_model.hits_per_life
-int
:游戏是否因过时而被人为终止(例如,球被卡住,直接垂直弹跳,桨不动)
如果你认为我需要更多关于游戏最终状态的数据,而不仅仅是这些,我很可能会实现一种非常容易得到它的方法。
这是我目前的健身计算,我认为这不是很好:
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
(除此之外:我不包括“与画面中心的距离”,因为我认为这是作弊;如果站在画面中心附近是最大限度提高游戏效率的一件好事,那么经纪人应该自己学习。如果你把所有的情报都潜入健身功能,那么你的经纪人根本就不聪明。)