Knights Archers Zombies (‘KAZ’)

../../../_images/butterfly_knights_archers_zombies.gif

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

导入

from pettingzoo.butterfly import knights_archers_zombies_v10

动作

离散

Parallel API

手动控制

智能体

agents= ['archer_0', 'archer_1', 'knight_0', 'knight_1']

智能体

4

动作形状

(1,)

动作值

[0, 5]

观测形状

(512, 512, 3)

观测值

(0, 255)

状态形状

(720, 1280, 3)

状态值

(0, 255)

僵尸从屏幕顶部边界以不可预测的路径向下走到底部边界。您控制的智能体是骑士和弓箭手(默认 2 个骑士和 2 个弓箭手),最初位于屏幕底部边界。每个智能体都可以顺时针或逆时针旋转,并向前或向后移动。每个智能体也可以通过攻击来杀死僵尸。当骑士攻击时,它会在其当前前进方向前方的弧形范围内挥舞狼牙棒。当弓箭手攻击时,它会沿弓箭手前进方向射出一支直线箭。当所有智能体死亡(与僵尸碰撞)或僵尸到达屏幕底部边界时,游戏结束。当骑士的狼牙棒击中并杀死一个僵尸时,骑士获得 1 分。当弓箭手的一支箭击中并杀死一个僵尸时,弓箭手获得 1 分。此环境有两种可能的观测类型:向量化和基于图像的。

向量化(默认)

将参数 vector_state=True 传递给环境。

每个智能体的观测值是一个 (N+1)x5 数组,其中 N = num_archers + num_knights + num_swords + max_arrows + max_zombies

请注意,num_swords = num_knights

观测值的行顺序大致如下所示

[
[current agent],
[archer 1],
...,
[archer N],
[knight 1],
...
[knight M],
[sword 1],
...
[sword M],
[arrow 1],
...
[arrow max_arrows],
[zombie 1],
...
[zombie max_zombies]
]

总共有 N+1 行。没有实体的行将全部为 0,但实体的顺序不会改变。

向量分解

这分解了观测值中一行的含义。所有距离都归一化到 [0, 1]。请注意,对于位置,[0, 0] 是图像的左上角。向下是正 y,向左是正 x。

对于当前智能体的向量

  • 第一个值没有意义,将始终为 0。

  • 接下来的四个值是当前智能体的位置和角度。

    • 前两个值是位置值,分别归一化到图像的宽度和高度。

    • 最后两个值表示智能体的前进方向,表示为单位向量。

对于其他所有内容

  • 矩阵的每一行(这是一个宽度为 5 的向量)的分解大致如下所示

    • 第一个值是实体与当前智能体之间的绝对距离。

    • 接下来的四个值是每个实体相对于当前智能体的相对位置和绝对角度。

      • 前两个值是相对于当前智能体的位置值。

      • 最后两个值表示实体相对于世界的方向角,表示为方向单位向量。

类型掩码

可以选择在每个行向量前附加一个类型掩码。这可以通过将 use_typemasks=True 作为关键字参数传递来启用。

类型掩码是一个宽度为 6 的向量,大致如下所示

[0., 0., 0., 1., 0., 0.]

每个值对应于

[zombie, archer, knight, sword, arrow, current agent]

如果那里没有实体,整个类型掩码(以及整个状态向量)将为 0。

因此,设置 use_typemask=True 会使观测值成为一个 (N+1)x11 向量。

序列空间(实验性)

还可以选择将 sequence_space=True 作为关键字参数传递给环境。这只是从观测值和状态向量中移除所有不存在的实体。请注意,由于状态和观测值大小不再恒定,这**仍处于实验阶段**。特别是,N 现在是一个可变数。

基于图像的

将参数 vector_state=False 传递给环境。

每个智能体将自身周围的正方形区域作为环境进行观测,其自身身体位于正方形的中心。观测值表示为智能体周围的 512x512 像素图像,换句话说,是智能体周围的 16x16 智能体大小的空间。

手动控制

使用 ‘W’、‘A’、‘S’ 和 ‘D’ 键移动弓箭手。使用 ‘F’ 键射箭。使用 ‘Q’ 和 ‘E’ 键旋转弓箭手。按 ‘X’ 键生成新的弓箭手。

使用 ‘I’、‘J’、‘K’ 和 ‘L’ 键移动骑士。使用 ‘;’ 键刺剑。使用 ‘U’ 和 ‘O’ 键旋转骑士。按 ‘M’ 键生成新的骑士。

参数

knights_archers_zombies_v10.env(
  spawn_rate=20,
  num_archers=2,
  num_knights=2,
  max_zombies=10,
  max_arrows=10,
  killable_knights=True,
  killable_archers=True,
  pad_observation=True,
  line_death=False,
  max_cycles=900,
  vector_state=True,
  use_typemasks=False,
  sequence_space=False,
)

spawn_rate: 在生成新僵尸之前需要多少个周期。数值越小意味着僵尸生成速度越快。

num_archers: 最初生成多少个弓箭手智能体。

num_knights: 最初生成多少个骑士智能体。

max_zombies: 同时存在的最大僵尸数量

max_arrows: 同时存在的最大箭矢数量

killable_knights: 如果设置为 False,骑士智能体不会被僵尸杀死。

killable_archers: 如果设置为 False,弓箭手智能体不会被僵尸杀死。

pad_observation: 如果智能体靠近环境边缘,它们的观测值无法形成 40x40 网格。如果设置为 True,观测值将用黑色填充。

line_death: 如果设置为 False,智能体触碰顶部或底部边界时不会死亡。如果设置为 True,智能体触碰顶部或底部边界后立即死亡。

vector_state: 是否使用向量化状态,如果设置为 False,将 代替 提供基于图像的观测值。

use_typemasks: 仅在设置 vector_state=True 时相关,为向量添加类型掩码。

sequence_space: 实验性,仅在设置 vector_state=True 时相关,移除向量状态中不存在的实体。

版本历史

  • v10: 添加向量化状态空间 (1.17.0)

  • v9: 代码重写和多处修复 (1.16.0)

  • v8: 代码清理和若干错误修复 (1.14.0)

  • v7: 修复了与回合结束崩溃相关的次要错误 (1.6.0)

  • v6: 修复了奖励结构 (1.5.2)

  • v5: 移除了 black death 参数 (1.5.0)

  • v4: 修复了观测和渲染问题 (1.4.2)

  • v3: 杂项错误修复,提升了 PyGame 和 PyMunk 版本 (1.4.0)

  • v2: 修复了 dones 计算方式中的错误 (1.3.1)

  • v1: 修复了所有环境处理过早死亡的方式 (1.3.0)

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

用法

AEC

from pettingzoo.butterfly import knights_archers_zombies_v10

env = knights_archers_zombies_v10.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 knights_archers_zombies_v10

env = knights_archers_zombies_v10.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.knights_archers_zombies.knights_archers_zombies.env(**kwargs)[source]
class pettingzoo.butterfly.knights_archers_zombies.knights_archers_zombies.raw_env(spawn_rate=20, num_archers=2, num_knights=2, max_zombies=10, max_arrows=10, killable_knights=True, killable_archers=True, pad_observation=True, line_death=False, max_cycles=900, vector_state=True, use_typemasks=False, sequence_space=False, 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 的动作。

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