出租车¶
此环境是玩具文本环境的一部分,其中包含有关环境的一般信息。
动作空间 |
|
观察空间 |
|
导入 |
|
出租车问题涉及在网格世界中导航到乘客,将他们接送,并将其送到四个位置中的一个。
描述¶
在 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 论文(“善变的出租车任务”)一致地实现转换概率是一个待办事项。
在某些情况下,执行动作对剧集的状态没有任何影响。在 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 值函数分解进行分层强化学习",人工智能研究杂志,第 13 卷,第 227-303 页,2000 年 11 月,doi: 10.1613/jair.639。
版本历史¶
v3: 地图更正 + 更清晰的域描述,v0.25.0 将动作屏蔽添加到重置和步骤信息中
v2: 禁止出租车起始位置 = 目标位置,更新出租车在展开中的观察结果,更新出租车奖励阈值。
v1: 从 locs 中删除 (3,2),添加 passidx<4 检查
v0: 初始版本发布