围棋¶

该环境是 经典环境 的一部分。请先阅读该页面以获取一般信息。
导入 |
|
---|---|
动作 |
离散 |
并行 API |
是 |
手动控制 |
否 |
智能体 |
|
智能体 |
2 |
动作形状 |
离散(362) |
动作值 |
离散(362) |
观察形状 |
(19, 19, 3) |
观察值 |
[0, 1] |
围棋是一种两人棋盘游戏,玩家分别为黑方和白方。黑方首先在空的棋盘交叉点上放置一颗黑子。白方接着放置自己的棋子,目标是围占比对手更多的地盘或吃掉对手的棋子。如果双方连续决定弃权,游戏结束。
我们的实现是 MiniGo 的一个封装器。
参数¶
围棋接受两个可选参数,用于定义棋盘尺寸(整数)和贴目点(浮点数)。棋盘尺寸和贴目的默认值分别为 19 和 7.5。
go_v5.env(board_size = 19, komi = 7.5)
board_size
: 棋盘每边的长度。
komi
: 给白方的补偿点数,以弥补其后手的不利。7.5 是中国围棋锦标赛的标准值,但可能并非完全平衡。
观察空间¶
观察是一个字典,其中包含一个 'observation'
元素,这是下面描述的常规强化学习观察,以及一个 'action_mask'
,其中包含合法动作,这在 合法动作屏蔽 部分进行了描述。
主观察形状是棋盘尺寸 N 的函数,形状为 (N, N, 3)。第一个平面 (:, :, 0) 表示当前玩家在棋盘上的棋子,而第二个平面 (:, :, 1) 编码对手的棋子。第三个平面 (:, :, 2) 如果当前玩家是 black_0
则全为 1,如果当前玩家是 white_0
则全为 0。棋盘状态的左上角表示为 (0, 0)。例如,(9, 9) 的棋盘是
0 1 2 3 4 5 6 7 8
0 . . . . . . . . . 0
1 . . . . . . . . . 1
2 . . . . . . . . . 2
3 . . . . . . . . . 3
4 . . . . . . . . . 4
5 . . . . . . . . . 5
6 . . . . . . . . . 6
7 . . . . . . . . . 7
8 . . . . . . . . . 8
0 1 2 3 4 5 6 7 8
平面 |
描述 |
---|---|
0 |
当前玩家的棋子 |
1 |
对手玩家的棋子 |
2 |
玩家 |
渲染时,棋盘坐标系遵循 GTP 协议。
合法动作屏蔽¶
当前智能体可用的合法动作可在字典观察的 action_mask
元素中找到。 action_mask
是一个二进制向量,向量中的每个索引代表该动作是否合法。 action_mask
对于非当前行动方智能体将全部为零。执行非法动作会导致游戏结束,非法行动方智能体获得 -1 的奖励,其他智能体获得 0 的奖励。
动作空间¶
与观察空间类似,动作空间取决于棋盘尺寸 N。
动作 ID |
描述 |
---|---|
\(0 \ldots (N-1)\) |
在棋盘第 1 行放置棋子。 |
\(N \ldots (2N- 1)\) |
在棋盘第 2 行放置棋子。 |
… |
… |
\((N^2-N) \ldots (N^2-1)\) |
在棋盘第 N 行放置棋子。 |
\(N^2\) |
弃权 |
例如,你可以使用动作 4
在棋盘的 (0,3) 位置放置棋子,或者使用动作 N^2
弃权。你可以通过计算 (a//N, a%N)
将非弃权动作 a
转换回其 2D (x,y) 坐标。总动作空间是 \(N^2+1\)。
奖励¶
赢家 |
输家 |
---|---|
+1 |
-1 |
版本历史¶
v5: 更改观察空间为 proper AlphaZero 风格的帧堆叠 (1.11.0)
v4: 修复了观察空间中黑白棋子保存方式的 bug (1.10.0)
v3: 修复了任意调用 observe() 的 bug (1.8.0)
v2: 观察中的合法动作屏蔽取代了 info 中的非法动作列表 (1.5.0)
v1: 所有环境版本升级,因采用了新的智能体迭代方案,所有智能体在完成后都会被迭代 (1.4.0)
v0: 初始版本发布 (1.0.0)
使用方法¶
AEC¶
from pettingzoo.classic import go_v5
env = go_v5.env(render_mode="human")
env.reset(seed=42)
for agent in env.agent_iter():
observation, reward, termination, truncation, info = env.last()
if termination or truncation:
action = None
else:
mask = observation["action_mask"]
# this is where you would insert your policy
action = env.action_space(agent).sample(mask)
env.step(action)
env.close()
API¶
- class pettingzoo.classic.go.go.raw_env(board_size: int = 19, komi: float = 7.5, render_mode: str | None = None, screen_height: int | None = 800)[source]¶
-
- observation_space(agent)[source]¶
接收智能体并返回该智能体的观察空间。
对于同一智能体名称,必须返回相同的值
默认实现是返回 observation_spaces 字典