我正在基于基于整洁的算法的神经网络,该算法学会在Python 2.7中播放Atari Breakout Clone,而我所有的作品都可以使用,但我认为进化可能可以使用通过更好地计算物种健身的算法,可以极大地改进。
神经网络的输入是:
- x桨中心的坐标
- x球中心的坐标
- y球中心的坐标
- Ball的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得分为0应该对健身稍有负面影响?
- 划桨击球的次数应具有效应,但对贡献/重量的影响不大。例如如果这个数字是0,那么它甚至没有真正试图在那一生中击中球,所以它应该具有负面效果
- 桨式击球的次数也应产生一定的效果,其贡献应基于得分。例如如果它没有多次击球并且也没有得分很多,那应该会产生重大的负面影响。如果没有多次击球,但得分很高,那应该具有显着的积极作用。总体而言,(i think )接近该值的距离是游戏分数,该价值对健身的贡献/权重
- 在框架中心和桨中心之间的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
(撇开:我没有包括"距离框架中心的距离",因为我认为这是作弊;如果呆在中心附近是一件好事以最大程度地提高游戏效率,那么代理人应该自行学习这一点。如果您将所有智能偷偷介绍到健身功能中,那么您的代理人根本就不聪明。)