拉米纸牌¶

此环境是 经典环境 的一部分。请先阅读该页面以获取一般信息。
导入 |
|
---|---|
动作 |
离散 |
并行 API |
是 |
手动控制 |
否 |
智能体 |
|
智能体 |
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 |
黑桃 |
13 - 25 |
红桃 |
26 - 38 |
方块 |
39 - 51 |
梅花 |
合法动作遮蔽¶
当前智能体的合法动作位于字典观察结果的 'action_mask'
元素中。action_mask'
是一个二进制向量,向量的每个索引表示该动作是否合法。对于除了当前回合智能体之外的任何智能体,action_mask'
将全部为零。采取非法动作将结束游戏,非法移动的智能体获得 -1 的奖励,所有其他智能体获得 0 的奖励。
动作空间¶
拉米纸牌中有 110 个动作。
动作 ID |
动作 |
---|---|
0 |
玩家 0 得分 |
1 |
玩家 1 得分 |
2 |
抽一张牌 |
3 |
从弃牌堆拾取顶部的牌 |
4 |
宣布死牌 |
5 |
Gin |
6 - 57 |
弃一张牌 |
58 - 109 |
敲牌 |
例如,您可以使用动作 2
抽一张牌,或使用动作 3
拾取一张弃牌。
奖励¶
游戏结束时,达成 Gin 的玩家获得 1 分,敲牌玩家获得 0.5 分,输家获得的奖励等于其死木点数的负值。
如果手牌被宣布为死牌,则两位玩家获得的奖励均等于其死木点数的负值。
结束动作 |
赢家 |
输家 |
---|---|---|
死牌 |
– |
|
敲牌 |
– |
|
Gin |
– |
|
请注意,默认值与 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()