拉米纸牌

../../../_images/classic_gin_rummy.gif

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

导入

from pettingzoo.classic import gin_rummy_v4

动作

离散

并行 API

手动控制

智能体

agents= ['player_0', 'player_1']

智能体

2

动作形状

Discrete(110)

动作值

Discrete(110)

观察形状

(5, 52)

观察值

[0,1]

拉米纸牌是一个使用 52 张牌的两人纸牌游戏。目标是组合 3 张或更多同点数或同花色顺子的牌。

我们的实现包装了 RLCard,您可以参考其文档获取更多详细信息。如果您在研究中使用此游戏,请引用他们的工作。

参数

拉米纸牌接受两个可选参数,用于定义敲牌或达成 Gin 的玩家获得的奖励。敲牌奖励和 Gin 奖励的默认值分别为 0.5 和 1.0。

gin_rummy_v4.env(knock_reward = 0.5, gin_reward = 1.0, opponents_hand_visible = False)

knock_reward: 敲牌玩家获得的奖励

gin_reward: 达成 Gin 的玩家获得的奖励

opponents_hand_visible: 设置为 True 以观察下方 观察空间 中描述的整个观察空间。设置为 False 将移除对未知牌的任何观察,并且观察空间将仅包含平面 0 到 3。

观察空间

观察结果是一个字典,包含一个 'observation' 元素(即下方描述的常规强化学习观察结果)和一个 'action_mask' 元素(包含合法动作,在 合法动作遮蔽 部分描述)。

主要观察空间是 5x52,行代表不同的平面,列代表一副牌中的 52 张牌。牌按花色(黑桃、红桃、方块、梅花)排序,并在每个花色内按点数(从 A 到 K)排序。

行索引

描述

0

当前玩家的手牌

1

弃牌堆顶部的牌

2

弃牌堆中的牌(不包括顶部的牌)

3

对手已知的牌

4

未知牌

列索引

描述

0 - 12

黑桃
0: A, 1: 2, …, 12: K

13 - 25

红桃
13: A … 25: K

26 - 38

方块
26: A … 38: K

39 - 51

梅花
39: A … 51: K

动作空间

拉米纸牌中有 110 个动作。

动作 ID

动作

0

玩家 0 得分
在敲牌、Gin 或死牌后使用,用于计算玩家手牌得分。

1

玩家 1 得分
在敲牌、Gin 或死牌后使用,用于计算玩家手牌得分。

2

抽一张牌

3

从弃牌堆拾取顶部的牌

4

宣布死牌

5

Gin

6 - 57

弃一张牌
6: 黑桃 A, 7: 黑桃 2, …, 18: 黑桃 K
19: 红桃 A … 31: 红桃 K
32: 方块 A … 44: 方块 K
45: 梅花 A … 57: 梅花 K

58 - 109

敲牌
58: 黑桃 A, 59: 黑桃 2, …, 70: 黑桃 K
71: 红桃 A … 83: 红桃 K
84: 方块 A … 96: 方块 K
97: 梅花 A … 109: 梅花 K

例如,您可以使用动作 2 抽一张牌,或使用动作 3 拾取一张弃牌。

奖励

游戏结束时,达成 Gin 的玩家获得 1 分,敲牌玩家获得 0.5 分,输家获得的奖励等于其死木点数的负值。

如果手牌被宣布为死牌,则两位玩家获得的奖励均等于其死木点数的负值。

结束动作

赢家

输家

死牌
两位玩家均受到惩罚

-deadwood_count / 100

敲牌
敲牌玩家:默认 +0.5

-deadwood_count / 100

Gin
达成 Gin 玩家:默认 +1

-deadwood_count / 100

请注意,默认值与 RLCard 中的略有不同——他们在敲牌时的默认奖励是 0.2。

deadwood_count / 100 的惩罚确保奖励永远不会低于 -1。

版本历史

  • v4: 升级到 RLCard 1.0.3 (1.11.0)

  • v3: 修复了任意调用 observe() 的 bug (1.8.0)

  • v2: 提升了 RLCard 版本,错误修复,观察结果中的合法动作遮蔽取代了 infos 中的非法移动列表 (1.5.0)

  • v1: 提升了 RLCard 版本,修复了观察空间,采用了新的智能体迭代方案,所有智能体完成后都会被迭代 (1.4.0)

  • v0: 初版发布 (1.0.0)

用法

AEC

from pettingzoo.classic import gin_rummy_v4

env = gin_rummy_v4.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.rlcard_envs.gin_rummy.env(**kwargs)[source]
class pettingzoo.classic.rlcard_envs.gin_rummy.raw_env(knock_reward: float = 0.5, gin_reward: float = 1.0, opponents_hand_visible: bool | None = False, render_mode: str | None = None, screen_height: int | None = 1000)[source]
observe(agent)[source]

返回智能体当前可以做出的观察结果。

last() 调用此函数。

render()[source]

根据 self.render_mode 指定的方式渲染环境。

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