水世界¶

此环境是 SISL 环境的一部分。请先阅读该页面以获取一般信息。
导入 |
|
---|---|
动作 |
连续 |
并行 API |
是 |
手动控制 |
否 |
智能体 |
|
智能体 |
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.raw_env(*args, **kwargs)[source]¶
-
- observation_space(agent)[source]¶
接受智能体并返回该智能体的观察空间。
对于相同的智能体名称,必须返回相同的值
默认实现是返回 observation_spaces 字典