围棋

../../../_images/classic_go.gif

该环境是 经典环境 的一部分。请先阅读该页面以获取一般信息。

导入

from pettingzoo.classic import go_v5

动作

离散

并行 API

手动控制

智能体

agents= ['black_0', 'white_0']

智能体

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

当前玩家的棋子
0: 无子, 1: 有子

1

对手玩家的棋子
0: 无子, 1: 有子

2

玩家
0: 白方, 1: 黑方

渲染时,棋盘坐标系遵循 GTP 协议。

动作空间

与观察空间类似,动作空间取决于棋盘尺寸 N

动作 ID

描述

\(0 \ldots (N-1)\)

在棋盘第 1 行放置棋子。
0: (0,0), 1: (0,1), …, N-1: (0,N-1)

\(N \ldots (2N- 1)\)

在棋盘第 2 行放置棋子。
N: (1,0), N+1: (1,1), …, 2N-1: (1,N-1)

\((N^2-N) \ldots (N^2-1)\)

在棋盘第 N 行放置棋子。
N^2-N: (N-1,0), N^2-N+1: (N-1,1), …, N^2-1: (N-1,N-1)

\(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.env(**kwargs)[source]
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]
action_space(agent)[source]

接收智能体并返回该智能体的动作空间。

对于同一智能体名称,必须返回相同的值

默认实现是返回 action_spaces 字典

close()[source]

关闭应释放的所有资源。

关闭渲染窗口、子进程、网络连接或任何其他应释放的资源。

observation_space(agent)[source]

接收智能体并返回该智能体的观察空间。

对于同一智能体名称,必须返回相同的值

默认实现是返回 observation_spaces 字典

observe(agent)[source]

返回智能体当前可以进行的观察。

last() 调用此函数。

render()[source]

按照 self.render_mode 指定的方式渲染环境。

渲染模式可以是 human,用于显示窗口。默认环境中的其他渲染模式有 ‘rgb_array’(返回 numpy 数组,经典环境之外的所有环境都支持)和 ‘ansi’(返回打印的字符串,经典环境特有)。

reset(seed=None, options=None)[source]

将环境重置到起始状态。

step(action)[source]

接受并执行当前 agent_selection 在环境中的动作。

自动将控制权切换到下一个智能体。