强化学习实战:自定义Gym环境之井字棋

Python63

在文章 强化学习实战 | 自定义Gym环境 中 ,我们了解了一个简单的环境应该如何定义,并使用 print 简单地呈现了环境。在本文中,我们将学习自定义一个稍微复杂一点的环境——井字棋。回想一下井字棋游戏:

  • 这是一个双人回合制博弈游戏,双方玩家使用的占位符是不一样的(圈/叉),动作编写需要区分玩家
    [En]

    this is a two-player round-off game in which the placeholders used by the two players are not the same (circle / fork), and the action writing needs to distinguish between players.*

  • 双方玩家获得的终局奖励是不一样的,胜方+1,败方-1(除非平局+0),奖励编写需要区分玩家
  • 终局的条件是:任意行 / 列 / 对角 占满了相同的占位符 or场上没有空位可以占位
  • 从单个agent的视角看,当前状态 s 下采取动作 a 后,新的状态 s_ 并不是后继状态,而是一个等待对手动作的中间状态,真正的后继状态是对手动作之后产生的状态 s'(除非采取动作 a 后游戏直接结束)。正如Sliver在课上回答同学关于多智能体应该如何处理时说的:"把其他agent也当作环境的一部分",如下图所示:

除了游戏本身的机制,考虑到与gym的API接口格式的契合,通过外部循环控制游戏进程是较方便的,所以env本身定义时不必要编写控制游戏进程 / 切换行动玩家的代码。另外,我们还需要更生动的环境呈现方式,而不是print!那么,接下来我们就来实现上述的目标吧!

步骤1:新建文件

来到目录:D:\Anaconda\envs\pytorch1.1\Lib\site-packages\gym\envs\user,创建文件 init.py 和 TicTacToe_env.py(还记得吗?文件夹user是文章 强化学习实战 | 自定义Gym环境 中我们创建的用来存放自定义环境的文件夹)。

步骤2:编写 TicTacToe_env.py 和 init.py

gym内置了一个绘图工具rendering,不过功能并不周全,想要绘制复杂的东西非常麻烦。本文不打算深入研究,只借助rendering中基本的线条 / 方块 / 圆圈呈现环境(更生动的游戏表现我们完全可以通过pygame来实现)。rendering是单帧绘制的,当调用env.render()时,将呈现当前 self.viewer.geoms 中所记录的绘画元素。环境的基本要素设计如下:

  • 状态:由二维的numpy.array表示,无占位符值为0,有蓝色占位符值为1,有红色占位符值为-1。
  • 动作:设计为一个字典,有着格式:action = {'mark':'blue', 'pos':(x, y)},其中'mark'表示占位符的颜色,用以区分玩家,'pos'表示占位符的位置。
  • 奖励:锁定蓝方视角,胜利+1,失败-1,平局+0。
输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Python

Python之模块导入(不看会后悔系列)

看到这个标题猜想大家内心OS: 什么辣鸡水文,划走划走~ 别急 有干货! 静态导入(照顾新人) 假设现在有两个文件a,b在不同目录,b文件想引用a文件中的函数: # test_module/sub_m...
Python

Python中yield返回生成器的详细方法

最简单、直观的认识,将 yield 看做 return 对待,只是 return 返回一个值,而 yield 返回一个生成器。 要理解 yield 的作用,必须理解生成器是什么? 在理解生成器之前,必...
Python

有一点思考的2021年终总结!

前言 2021阳历年即将过去,今年的我也将继续写下今年的年终总结!对过去的自己进行总结,对未来的自己给予展望! 今年事件 反抗996 年后第一天,老板在开会快结束的时候,说了我们需要奋斗,需要向某某公...
Python

Node.js基础入门第四天

经过前面三天的学习,Node.js的基础知识已逐渐掌握,今天继续学习缓存区和文件操作,并稍加整理加以分享,如有不足之处,还请指正。 缓存区 1. 什么是缓存区? JavaScript语言自身只有基本数...
Python

字符编码

字符=====》计算机翻译=====》二进制====》内存======》硬盘 GBK 中文编码标准 16位表示65536个字符 1994年,包括世界上所有国家字符的标准UNICODE 2个字节表示一个...
Python

爬虫系列:爬虫验证码识别

虽然大多数人对单词"CAPTCHA"都很熟悉,但是很少人知道它的具体含义:全自动区分计算机和人类的图灵测试(Completely Automated Public Turing test to tel...
Python

Win10系统总是锁屏关闭屏幕该怎么办?

使用Win10系统很长时间了,最近发现一个问题,当我们将电脑屏幕锁定之后,显示器会自动在1分钟后关闭,那么如果我们不想使显示器自动关闭该怎么设置呢? 1、首先,请大家在桌面上按下Windows徽标键+...
Python

使用vscode对threejs的本地调试

始终坚信阅读和调试结合的方式,才是学习开源的高效方法 一、老版本调试 遥想当年的threejs(使用版本为r75)还没有CommonJS,对于我这个小白可以拿起大刀大杀四方......(咳。咳。 就是...
Python

一文弄懂Python中的Map、Filter和Reduce函数

1. 引言 本文重点介绍Python中的三个特殊函数Map,Filter和Reduce,以及如何使用它们进行代码编程。在开始介绍之前,我们先来理解两个简单的概念高阶函数和Lambda函数。 闲话少说,...