出租车¶

此环境是 Toy Text (玩具文本) 环境的一部分,其中包含有关环境的通用信息。
动作空间 |
|
观测空间 |
|
导入 |
|
出租车问题涉及在网格世界中导航到乘客,接他们并将其送到四个位置之一。
描述¶
在 5x5 网格世界中,有四个指定的接送地点(红色、绿色、黄色和蓝色)。出租车从随机方格开始,乘客在指定的地点之一。
目标是驾驶出租车到乘客的位置,接上乘客,移动到乘客想要的目的地,然后放下乘客。一旦乘客被放下,回合结束。
玩家因成功将乘客送到正确位置而获得正奖励。因不正确的尝试接送乘客以及每一步未收到其他奖励而获得负奖励。
地图
+---------+
|R: | : :G|
| : | : : |
| : : : : |
| | : | : |
|Y| : |B: |
+---------+
来自 Tom Dietterich 的 “具有 MAXQ 值函数分解的分层强化学习” [1]。
动作空间¶
动作形状为 (1,)
,范围为 {0, 5}
,指示出租车移动的方向或接送乘客。
0:向南移动(向下)
1:向北移动(向上)
2:向东移动(向右)
3:向西移动(向左)
4:接乘客
5:放下乘客
观测空间¶
有 500 个离散状态,因为有 25 个出租车位置,乘客的 5 个可能位置(包括乘客在出租车中的情况)和 4 个目的地位置。
地图上的目的地用颜色的首字母表示。
乘客位置
0:红色
1:绿色
2:黄色
3:蓝色
4:在出租车上
目的地
0:红色
1:绿色
2:黄色
3:蓝色
观测值作为 int()
返回,它编码了相应的状态,计算公式为 ((taxi_row * 5 + taxi_col) * 5 + passenger_location) * 4 + destination
请注意,在一个回合中实际可以达到的状态有 400 个。 缺失的状态对应于乘客与其目的地位于同一位置的情况,因为这通常标志着回合的结束。 在成功回合结束后,当乘客和出租车都在目的地时,可以观察到另外四个状态。 这总共给出了 404 个可到达的离散状态。
起始状态¶
初始状态从可能的起始状态中均匀采样,其中乘客既不在目的地也不在出租车内。 有 300 个可能的初始状态:25 个出租车位置,4 个乘客位置(不包括在出租车内)和 3 个目的地(不包括乘客当前位置)。
奖励¶
每步 -1,除非触发其他奖励。
+20 交付乘客。
-10 非法执行 “接乘客” 和 “放下乘客” 动作。
导致无操作的动作(例如撞墙)将导致时间步惩罚。 可以通过采样 info
中返回的 action_mask
来避免无操作。
回合结束¶
如果发生以下情况,回合结束
终止:1. 出租车放下乘客。
截断(当使用 time_limit 包装器时):1. 回合长度为 200。
信息¶
step()
和 reset()
返回一个带有以下键的字典
p - 状态的转移概率。
action_mask - 动作是否会导致转移到新状态。
由于出租车不是随机的,因此转移概率始终为 1.0。 根据 Dietterich 论文(“The fickle taxi task”)实现转移概率是 TODO。
在某些情况下,采取动作不会对回合状态产生影响。 在 v0.25.0 中,info["action_mask"]
包含一个 np.ndarray,用于指定动作是否会改变状态的每个动作。
要采样一个修改动作,请使用 action = env.action_space.sample(info["action_mask"])
或使用基于 Q 值的算法 action = np.argmax(q_values[obs, np.where(info["action_mask"] == 1)[0]])
。
参数¶
import gymnasium as gym
gym.make('Taxi-v3')
参考文献¶
[1] T. G. Dietterich, “具有 MAXQ 值函数分解的分层强化学习,” Journal of Artificial Intelligence Research, vol. 13, pp. 227–303, Nov. 2000, doi: 10.1613/jair.639。
版本历史¶
v3:地图更正 + 更清晰的领域描述,v0.25.0 动作掩码添加到 reset 和 step 信息中
v2:不允许出租车起始位置 = 目标位置,更新 rollout 中的出租车观测,更新出租车奖励阈值。
v1:从 locs 中删除 (3,2),添加 passidx<4 检查
v0:初始版本发布