强化学习—在井字游戏中随机选择玩家符号的效果

什么是井字游戏?

井字游戏由两个玩家X和O玩,他们轮流在3×3的网格世界中创造空间。 成功将三个标记放在水平,垂直或对角线上的玩家将赢得比赛。

增加随机性超参数的目的:-

The Lazy Programmer上了一堂很棒的关于强化学习的课程之后,其中一个用来支撑重点的例子是井字游戏。 我考虑过在随机或人类之间进行游戏时,随机选择代理符号的超参数将如何影响井字游戏代理探索-探索困境中ε贪婪方法的学习率使用强化学习。

原始架构缺点:-

首先,在运行要训练代理的游戏之后,在准备与人类对战之前,先对自己的两个版本使用不同的符号对战10,000次。 可以观察到,座席很聪明,足以知道中心位置是赢得比赛的最强起点。 考虑是否通过简单地在训练后更改座席符号,而不是自动将人类与第一个座席对战,后者将始终取X并由人类取O,而相反地反转符号,座席仍将基于它总是与其他特工对阵X的事实。

  #玩人与代理 
#您认为代理人学会了玩游戏吗?
人=人()
human.set_symbol(env.o)
而True
p2.set_symbol(env.x)
p2.set_verbose( True
play_game(p2,human,Environment(),draw = 2)

正如怀疑的那样,此超参数的最终效果是该代理不再像以前那么聪明。

事实已被以下事实所证实:特工开始在网格上的1,0位置上与人类对战,并最终由于玩智能动作而输掉了比赛,原因是它只是以X的形式进行比赛而没有学过O的最佳动作,因为它没有跟踪状态的最佳值。

尝试改进的原因:-

因此,向游戏添加了随机符号选择功能。 对于在培训/学习阶段的代理商。

  def random_select_player(p1,p2): 
p_select = rd.choice([p1,p2])
返回p_select#给每个玩家他们的符号
p_x = random_select_player(p1,p2)
if(p_x == p1):
p_o = p2
其他:
p_o = p1
p_x.set_symbol(env.x)
p_o.set_symbol(env.o)

以及在训练两个特工之后的“人与特工”期间。

 #玩人与代理 
#您认为代理人学会了玩游戏吗?
人=人()
p_1 = random_select_player(p1,p2)
p_x = random_select_player(human,p_1)

如果 (p_x == human):
p_o = p_1
其他
p_o =人类

p_x.set_symbol(env.x)
p_o.set_symbol(env.o)

而True
p_1 = random_select_player(p1,p2)
p_x = random_select_player(人类,p_1)

如果 (p_x == human):
p_o = p_1
p_o.set_verbose( True
其他
p_o =人类
p_x.set_verbose( True

p_x.set_symbol(env.x)
p_o.set_symbol(env.o)

Github上的代码

实验结果:-

此后,我们发现对于这两个特工,他们都可以像以前那样使用简单的固定符号玩法,并且不仅学习相对于符号位置的最佳移动,还需要更长的训练时间。需要2万场比赛,但这仍然是使每个特工符号保持不变的体系结构的改进,无论他们接受了多长时间的训练,都没有为特工打反符号做任何准备。 这使代理有更多时间玩两个符号,并根据所选符号和环境中的位置学习最佳移动。