石头剪刀布

../../../_images/classic_rps.gif

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

导入

from pettingzoo.classic import rps_v2

行动

离散

Parallel API

手动控制

智能体

agents= ['player_0', 'player_1']

智能体

2

行动形状

Discrete(3)

行动值

Discrete(3)

观测形状

Discrete(4)

观测值

Discrete(4)

石头剪刀布是一个双人手势游戏,每位玩家选择石头、剪刀或布中的一个,然后同时亮出选择。如果双方选择相同,则为平局。然而,如果选择不同,胜者判定规则如下:石头胜剪刀,剪刀胜布,布胜石头。

可以通过添加新的行动对来扩展游戏,增加额外的行动。成对添加新行动可以使游戏更平衡。这意味着最终游戏将拥有奇数个行动,每个行动恰好能战胜其他行动的一半,同时被另一半击败。这种游戏最常见的扩展是 石头剪刀布蜥蜴斯波克,其中只增加了一对额外的行动。

参数

rps_v2.env(num_actions=3, max_cycles=15)

num_actions:游戏中适用的行动数量。石头剪刀布游戏的默认值为 3。此参数必须是大于 3 的奇数整数。如果给定值为 5,则游戏扩展为石头剪刀布蜥蜴斯波克。

max_cycles:经过 max_cycles 步后,所有智能体将返回完成(done)。

观测空间

石头剪刀布

如果需要 3 个行动,则玩的是标准的石头剪刀布游戏。观测值是对手的最后行动,其空间是一个标量值,有 4 个可能的值。由于双方玩家同时亮出选择,所以在双方行动之前,观测值为 None。因此,3 代表尚未采取行动。石头用 0 表示,布用 1 表示,剪刀用 2 表示。

观测

0

石头

1

2

剪刀

3

None

扩展游戏

如果游戏中需要的行动数量大于 3,观测值仍然是对手的最后行动,其空间是具有 1 + n 个可能值的标量,其中 n 是行动的数量。在双方玩家行动之前,观测值也将为 None,并且空间中最大的可能标量值 1 + n 代表尚未采取行动。额外行动从 0 石头行动开始按递增顺序编码。如果需要 5 个行动,游戏将扩展到石头剪刀布蜥蜴斯波克。下表显示了一个具有 7 个可能行动的观测空间的示例。

观测

0

石头

1

2

剪刀

3

蜥蜴

4

斯波克

5

行动_6

6

行动_7

7

None

行动空间

石头剪刀布

行动空间是一个标量值,有 3 个可能的值。这些值编码如下:石头是 0,布是 1,剪刀是 2。

行动

0

石头

1

2

剪刀

扩展游戏

行动空间是一个标量值,有 n 个可能的值,其中 n 是额外行动对的数量。下表显示了 7 个可能行动的值编码示例。

行动

0

石头

1

2

剪刀

3

蜥蜴

4

斯波克

5

行动_6

6

行动_7

奖励

胜者

败者

+1

-1

如果游戏平局,双方玩家将获得 0 的奖励。

版本历史

  • v2: 合并石头剪刀布和石头剪刀布蜥蜴斯波克环境,添加 num_actions 和 max_cycles 参数 (1.9.0)

  • v1: 由于采用了新的智能体迭代方案,其中所有智能体在完成后都会被迭代,因此提升了所有环境的版本 (1.4.0)

  • v0: 初始版本发布 (1.0.0)

用法

AEC

from pettingzoo.classic import rps_v2

env = rps_v2.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:
        # this is where you would insert your policy
        action = env.action_space(agent).sample()

    env.step(action)
env.close()

Parallel

from pettingzoo.classic import rps_v2

env = rps_v2.parallel_env(render_mode="human")
observations, infos = env.reset()

while env.agents:
    # this is where you would insert your policy
    actions = {agent: env.action_space(agent).sample() for agent in env.agents}

    observations, rewards, terminations, truncations, infos = env.step(actions)
env.close()

API

class pettingzoo.classic.rps.rps.env(**kwargs)[source]
class pettingzoo.classic.rps.rps.raw_env(num_actions: int | None = 3, max_cycles: int | None = 15, render_mode: str | None =None, screen_height: int | None =800)[source]

石头剪刀布的双人环境。

可扩展到石头剪刀布蜥蜴斯波克、行动_6、行动_7...等多种行动的环境。观测值仅为对手的最后行动。

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 的行动。

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