Pistonball

../../../_images/butterfly_pistonball.gif

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

导入

from pettingzoo.butterfly import pistonball_v6

动作

模式

Parallel API

启用

手动控制

启用

智能体

agents= ['piston_0', 'piston_1', ..., 'piston_19']

智能体

20

动作形状

(1,)

动作值

[-1, 1]

观测形状

(457, 120, 3)

观测值

(0, 255)

状态形状

(560, 880, 3)

状态值

(0, 255)

这是一个基于物理的合作游戏,目标是通过激活垂直移动的活塞将球移动到游戏边界的左墙。为了获得该环境的最佳策略,活塞必须学习高度协调的行为。

观测:每个活塞智能体的观测是一个 RGB 图像,包含活塞本身、其紧邻的活塞(两个活塞或一个活塞与左/右墙)以及它们上方的空间(可能显示球)。

动作:每个时间步都可以对每个活塞执行动作。在离散模式下,动作空间 0 表示向下移动 4 像素,1 表示保持静止,2 表示向上移动 4 像素。在连续模式下,[-1, 1] 范围内的值与活塞下降或升高的量成比例。连续动作会按系数 4 进行缩放,以匹配离散模式下的移动距离,例如,动作 -1 将活塞向下移动 4 像素。

奖励:根据球在上一个时间步向左移动了多少(向右移动会导致负奖励)加上固定的时间惩罚,为每个智能体提供相同的奖励。距离部分是球在过去的时间步内移动的距离占其到左墙的初始总距离(即游戏开始时)的百分比。例如,如果球在游戏开始时距离墙 300 像素,在时间步开始时距离 180 像素,并在时间步结束时距离 175 像素,则距离奖励将是 100 * 5/300 = 1.7。每个时间步还会向基于距离的奖励添加一个可配置的时间惩罚(默认:-0.1)。例如,如果球在一个时间步内没有移动,奖励将是 -0.1 而不是 0。这是为了鼓励更快地解决游戏。

Pistonball 使用 chipmunk 物理引擎,因此物理效果与游戏《愤怒的小鸟》中的逼真程度相当。

按键 a 和 d 控制选择哪个活塞进行移动(初始时选择最右边的活塞),按键 w 和 s 控制活塞在垂直方向移动。

参数

pistonball_v6.env(n_pistons=20, time_penalty=-0.1, continuous=True,
random_drop=True, random_rotate=True, ball_mass=0.75, ball_friction=0.3,
ball_elasticity=1.5, max_cycles=125)

n_pistons:环境中的活塞(智能体)数量。

time_penalty:每个时间步添加到每个活塞的奖励量。值越高意味着越重视将球移过屏幕以结束游戏。

continuous:如果为 True,活塞动作是 -1 到 1 之间的实数值,添加到活塞高度。如果为 False,则动作是向上或向下移动一个单位的离散值。

random_drop:如果为 True,球最初会在随机的 x 值处生成。如果为 False,球将始终在 x=800 处生成。

random_rotate:如果为 True,球会以随机角动量生成。

ball_mass:设置球物理对象的质量。

ball_friction:设置球物理对象的摩擦力。

ball_elasticity:设置球物理对象的弹性。

max_cycles:在 max_cycles 步后,所有智能体将返回完成。

版本历史

  • v6:修复球从左墙弹回的问题。

  • v5:由于物理引擎不精确导致球进入左列不再提供额外奖励。

  • v4:更改了 max_cyclescontinuous 的默认参数,更新了 PyMunk 版本 (1.6.0)。

  • v3:重构,添加了活塞数量参数,微小的视觉变化 (1.5.0)。

  • v2:各种修复,更新了 PyGame 和 PyMunk 版本 (1.4.0)。

  • v1:修复连续模式 (1.0.1)。

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

用法

AEC

from pettingzoo.butterfly import pistonball_v6

env = pistonball_v6.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.butterfly import pistonball_v6

env = pistonball_v6.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.butterfly.pistonball.pistonball.env(**kwargs)[source]
class pettingzoo.butterfly.pistonball.pistonball.raw_env(n_pistons=20, time_penalty=-0.1, continuous=True, random_drop=True, random_rotate=True, ball_mass=0.75, ball_friction=0.3, ball_elasticity=1.5, max_cycles=125, render_mode=None)[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]

将环境重置到起始状态。

state()[source]

返回全局环境的观测。

step(action)[source]

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

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