水世界

../../../_images/sisl_waterworld.gif

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

导入

from pettingzoo.sisl import waterworld_v4

动作空间

连续

Parallel API

手动控制

智能体

agents= ['pursuer_0', 'pursuer_1', ..., 'pursuer_4']

智能体

5

动作形状

(2,)

动作取值

[-0.01, 0.01]

观察形状

(242,)

观察取值

[-√2, 2*√2]

水世界模拟了古菌在其环境中导航并努力生存的过程。这些被称为“追逐者”的古菌试图在避开毒药的同时消耗食物。水世界中的智能体是追逐者,而食物和毒药属于环境。毒药的半径是追逐者半径的 0.75 倍,而食物的半径是追逐者半径的 2 倍。根据输入参数,多个追逐者可能需要协作来消耗食物,从而形成一种既合作又竞争的动态。类似地,奖励可以全局分配给所有追逐者,也可以局部应用于特定的追逐者。环境是一个连续的二维空间,每个追逐者的位置都有 x 和 y 值,范围都在 [0,1] 内。智能体无法越过 x 和 y 值的最小值和最大值处的边界。智能体通过选择一个推力向量来增加其当前速度。每个追逐者都有一些均匀分布的传感器,可以读取附近物体的速度和方向。这些信息在观察空间中报告,可用于导航环境。

观察空间

每个智能体的观察形状是一个长度大于 4 的向量,其长度取决于环境的输入参数。向量的总长度是每个传感器的特征数量乘以传感器数量,再加上两个分别表示追逐者是否与食物或毒药碰撞的元素。默认情况下,如果启用 speed_features,每个传感器的特征数量为 8,如果关闭 speed_features,则为 5。因此,如果启用 speed_features,观察形状的完整形式是 (8 × n_sensors) + 2。观察向量的元素取值范围是 [-1, 1]。

例如,默认情况下有 5 个智能体(紫色)、5 个食物目标(绿色)和 10 个毒药目标(红色)。每个智能体有 30 个范围有限的传感器(由黑线表示),用于检测附近的实体(食物和毒药目标),从而产生一个包含 242 个计算值的向量作为观察空间。这些值代表每个传感器感应到的距离和速度。在其范围内未感应到任何物体的传感器,其速度报告为 0,距离报告为 1。

与参考环境相比,此版本已修复,以防止物体飘出屏幕并永远丢失。

下表列出了启用 speed_features = True 时的观察空间

索引:[开始, 结束)

描述

取值范围

0 到 n_sensors

每个传感器的障碍物距离

[0, 1]

n_sensors 到 (2 * n_sensors)

每个传感器的边界距离

[0, 1]

(2 * n_sensors) 到 (3 * n_sensors)

每个传感器的食物距离

[0, 1]

(3 * n_sensors) 到 (4 * n_sensors)

每个传感器的食物速度

[-2*√2, 2*√2]

(4 * n_sensors) 到 (5 * n_sensors)

每个传感器的毒药距离

[0, 1]

(5 * n_sensors) 到 (6 * n_sensors)

每个传感器的毒药速度

[-2*√2, 2*√2]

(6 * n_sensors) 到 (7 * n_sensors)

每个传感器的追逐者距离

[0, 1]

(7 * n_sensors) 到 (8 * n_sensors)

每个传感器的追逐者速度

[-2*√2, 2*√2]

8 * n_sensors

指示智能体是否与食物碰撞

{0, 1}

(8 * n_sensors) + 1

指示智能体是否与毒药碰撞

{0, 1}

下表列出了禁用 speed_features = False 时的观察空间

索引:[开始, 结束)

描述

取值范围

0 - n_sensors

每个传感器的障碍物距离

[0, 1]

n_sensors - (2 * n_sensors)

每个传感器的边界距离

[0, 1]

(2 * n_sensors) - (3 * n_sensors)

每个传感器的食物距离

[0, 1]

(3 * n_sensors) - (4 * n_sensors)

每个传感器的毒药距离

[0, 1]

(4 * n_sensors) - (5 * n_sensors)

每个传感器的追逐者距离

[0, 1]

(5 * n_sensors)

指示智能体是否与食物碰撞

{0, 1}

(5 * n_sensors) + 1

指示智能体是否与毒药碰撞

{0, 1}

动作空间

智能体有一个连续的动作空间,表示为一个包含 2 个元素的向量,对应于水平和垂直推力。取值范围取决于 pursuer_max_accel。动作取值必须在范围 [-pursuer_max_accel, pursuer_max_accel] 内。如果此动作向量的幅度超过 pursuer_max_accel,它将被按比例缩小到 pursuer_max_accel。此速度向量会添加到古菌的当前速度上。

智能体动作空间: [horizontal_thrust, vertical_thrust]

奖励

当多个智能体(取决于 n_coop)一起捕获食物时,每个智能体获得 food_reward 的奖励(食物不会被摧毁)。它们因接触食物获得 encounter_reward 的塑形奖励,因接触毒药获得 poison_reward 的奖励,并且每采取一个动作,还会获得 thrust_penalty x ||action|| 的奖励,其中 ||action|| 是动作速度的欧几里得范数。所有这些奖励也根据 local_ratio 进行分配,其中按 local_ratio 缩放的奖励(局部奖励)应用于产生奖励的智能体,而按智能体数量平均后的奖励(全局奖励)按 (1 - local_ratio) 缩放并应用于所有智能体。默认情况下,环境运行 500 帧。

参数

waterworld_v4.env(n_pursuers=5, n_evaders=5, n_poisons=10, n_coop=2, n_sensors=20,
sensor_range=0.2,radius=0.015, obstacle_radius=0.2, n_obstacles=1,
obstacle_coord=[(0.5, 0.5)], pursuer_max_accel=0.01, evader_speed=0.01,
poison_speed=0.01, poison_reward=-1.0, food_reward=10.0, encounter_reward=0.01,
thrust_penalty=-0.5, local_ratio=1.0, speed_features=True, max_cycles=500)

n_pursuers:追逐古菌(智能体)的数量

n_evaders:食物对象的数量

n_poisons:毒药对象的数量

n_coop:必须同时接触食物才能消耗食物的追逐古菌(智能体)数量

n_sensors:所有追逐古菌(智能体)上的传感器数量

sensor_range:所有追逐古菌(智能体)上传感器树突的长度

radius:古菌基本半径。追逐者:半径,食物:半径的 2 倍,毒药:半径的 3/4 倍

obstacle_radius:障碍物半径

obstacle_coord:障碍物坐标。可以设置为 None 以使用随机位置

pursuer_max_accel:追逐古菌最大加速度(最大动作大小)

pursuer_speed:追逐者(智能体)最大速度

evader_speed:食物速度

poison_speed:毒药速度

poison_reward:追逐者消耗毒药对象获得的奖励(通常为负)

food_reward:追逐者消耗食物对象获得的奖励

encounter_reward:追逐者与食物对象碰撞获得的奖励

thrust_penalty:用于惩罚大动作的负奖励的缩放因子

local_ratio:奖励在局部和全局分配的比例

speed_features:切换追逐古菌(智能体)传感器是否检测其他物体和古菌的速度

max_cycles:在 max_cycles 步之后,所有智能体将返回 done

  • v4:重大重构 (1.22.0)

  • v3:重构和重大错误修复 (1.5.0)

  • v2:杂项错误修复 (1.4.0)

  • v1:各种修复和环境参数更改 (1.3.1)

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

用法

AEC

from pettingzoo.sisl import waterworld_v4

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

    env.step(action)
env.close()

Parallel

from pettingzoo.sisl import waterworld_v4

env = waterworld_v4.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.sisl.waterworld.waterworld.env(**kwargs)[source]
class pettingzoo.sisl.waterworld.waterworld.raw_env(*args, **kwargs)[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]

将环境重置到起始状态。

step(action)[source]

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

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