水世界

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

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

导入

from pettingzoo.sisl import waterworld_v4

动作

连续

并行 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:古菌基础半径。追逐者:radius,食物:2 x radius,毒药:3/4 x radius

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 步之后,所有智能体将返回完成状态

  • 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()

并行

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

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