强化学习实战 | 自定义Gym环境之扫雷

本文介绍如何使用Python自定义Gym环境来实现扫雷游戏。通过新建文件、编写环境逻辑,利用二维卷积处理格子提示数,并讨论了不同状态空间设计对学习系统性能的影响。最后,通过测试确保环境正常运行。
摘要由CSDN通过智能技术生成

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

开始之前

先考虑几个问题:

  • Q1:如何展开无雷区?
  • Q2:如何计算格子的提示数?
  • Q3:如何表示扫雷游戏的状态?

A1:可以使用递归函数,或是堆栈。

A2:一般的做法是,需要打开某格子时,再去统计周围的雷数。如果有方便的二维卷积函数可以调用,这会是个更简洁的方法:

[1001001001101000000001001]★[111101111]=[1221233331131212322110110]

\begin{bmatrix} 1 & 0 & 0 & 1 & 0\ 0 & 1 & 0 & 0 & 1\ 1 & 0 & 1 & 0 & 0\ 0 & 0 & 0 & 0 & 0\ 0 & 1 & 0 & 0 & 1 \end{bmatrix}\bigstar \begin{bmatrix} 1 & 1 & 1\ 1 & 0 & 1\ 1 & 1 & 1 \end{bmatrix}= \begin{bmatrix} 1 & 2 & 2 & 1 & 2\ 3 & 3 & 3 & 3 & 1\ 1 & 3 & 1 & 2 & 1\ 2 & 3 & 2 & 2 & 1\ 1 & 0 & 1 & 1 & 0 \end{bmatrix}
 不妨用 ★\bigstar 表示二维卷积运算。等号左边的5×5矩阵表示了雷的分布情况,值1表示有雷,值0表示无雷;等号左边的3×3矩阵是求解周围雷数的卷积核(或称滤波器,特征提取器);等号右边的矩阵即是所有格子的周围雷数。

代码实现起来也非常简单:

from scipy import signal
import numpy as np
state\_mine = np.array([[1,0,0,1,0],[0,1,0,0,1],[1,0,1,0,0],[0,0,0,0,0],[0,1,0,0,1]])
KERNAL = np.array([[1,1,1],[1,0,1],[1,1,1]])
state\_num = signal.convolve2d(state\_mine, KERNAL, 'same')

A3:对于玩家来说,游戏状态是不完全观测的,也即需要区分观测状态环境状态。环境状态包括雷分布矩阵,和提示数矩阵(也即上式提到的);观测状态是玩家部分可见的环境状态,需要根据格子的打开状态对雷分布矩阵进行部分屏蔽。观测状态不包括雷分布矩阵,因为一旦触雷即游戏结束,所以游戏中所有非终止状态都是无雷的。

那么对于一个大小为M×NM \times N的扫雷游戏,环境状态可以表示为 M×N×2M \times N \times 2 的张量:频道1是雷分布矩阵,频道2是提示数矩阵;观测状态可以表示为 M×N×2M \times N \times 2 的张量:频道1是表示格子打开状态的矩阵(值1为打开,值0为未打开),并以此矩阵对 提示数矩阵进行元素乘,完成对环境状态的部分屏蔽,作为第二个频道。对于numpy.array而言,元素乘是容易的:

observe\_num = state\_num * state\_open

以下图的游戏状态为例说明:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值