强化学习中的SARSA算法与分层强化学习在出租车环境中的应用
立即解锁
发布时间: 2025-09-01 01:06:04 阅读量: 15 订阅数: 14 AIGC 


谷歌云AI实战指南
### 强化学习中的SARSA算法与分层强化学习在出租车环境中的应用
#### 1. SARSA学习代码分析
首先,我们来看一段SARSA学习代码:
```python
learning_steps = 0
while learning_steps < total_steps:
state = env.reset()
while True:
render(learning_steps, env, epsilon)
action = act(state)
state2, reward, done, info = env.step(action)
action2 = act(state2)
learn(state, state2, reward, action, action2)
state = state2
action = action2
learning_steps += 1
epsilon = min_epsilon + (max_epsilon - min_epsilon) * np.exp(-decay_rate * learning_steps)
```
这段代码与Q学习代码类似,但有一些关键变化。在执行`env.step`后,智能体再次调用`learn`函数,并传入`state2`。虚拟移动的动作会被输入到`learn`函数中进行更新。当代码进入下一个循环时,`act`函数会使用更新后的状态再次被调用,要注意这个新动作可能与上一次调用`learn`时使用的动作不同。运行这段代码,我们会发现这个例子的训练速度比之前的Q学习例子快约10倍。
#### 2. 使用SARSA算法驾驶出租车
OpenAI Gym有数千个环境和变体可用于测试强化学习算法。大多数环境使用连续状态和/或动作,这使得使用离散方法变得困难,但并非不可能。在大多数情况下,要处理更复杂的环境需要结合深度学习。不过,有一个离散环境“Taxi”可以更好地测试SARSA算法。
##### 2.1 Taxi环境介绍
Taxi环境的布局如下:
- 实线表示墙壁或不可通行区域。
- 四个字母表示乘客的接送地点。
- 智能体的目标是接送乘客,每次移动会获得 -1 的奖励,成功送达乘客会获得 +20 的奖励,错误送达会获得 -10 的奖励。
##### 2.2 代码示例
我们通过以下步骤来实现智能体在Taxi环境中的学习:
1. **打开`Chapter_8_SARSA_Taxi.ipynb`文件**:运行到如下代码块:
```python
def render_game(env):
clear_output()
env.render()
time.sleep(.5)
```
这个`render_game`函数的作用是渲染游戏输出,并暂停执行0.5秒。因为这个例子可能需要较长时间,所以我们只在每隔几集时输出智能体的游戏情况。同时,使用`episodes`来限制智能体的步数,避免陷入无限循环。
2. **滚动到下一个代码单元**:
```python
def play_game(env,ep, max):
d = False
s = env.reset()
st = 0
while not d and st < max:
a = act(state)
s2, r, d, i = env.step(a)
print(f'Episode:{ep} Step{st} reward:{r}')
render_game(env)
st += 1
```
这个`play_game`函数接收当前环境、集数和步数上限`max`作为输入,智能体根据当前策略进行游戏。
3. **滚动到最后一个代码单元**:
```python
step = 0
max_steps = 100
total_episodes = 10000
learning_steps = 0
rewards = 0
total_rewards = 0
for episode in range(total_episodes):
step = 0
state = env.reset()
action = act(state)
while step < max_steps:
#env.render()
state2, reward, done, info = env.step(action)
action2 = act(state2)
learn(state, state2, reward, action, action2)
state = state2
action = action2
step += 1
rewards+=reward
epsilon = min_epsilon + (max_epsilon - min_epsilon) * np.exp(-decay_rate * learning_steps)
if done:
break
if episode > 100 and episode % 50 == 0:
play_game(env, episode, max_steps)
env.close()
```
这段代码与之前的代码有一些不同:
- 以集为单位进行训练,并设置了最大步数限制,防止智能体无限徘徊。
- 这不是传统的 episodic learning,智能体在训练过程中持续学习。
- 在第100集之后,每隔50集智能体进行一次示例游戏,目的是为了监控输出。
#### 3. 理解Taxi状态空间
##### 3.1 状态空间计算
通过查看`taxi.py`源代码,我们可以了解状态空间的计算方式:
```python
class TaxiEnv(discrete.DiscreteEnv):
"""
The Taxi Problem
from "Hierarchical Reinforcement Learning with the MAXQ Value Function Decomposition"
by Tom Dietterich
Description:
There are four designated locations in the grid world indicated by R(ed), G(reen), Y(ellow), and B(lue). When the episode starts, the taxi starts off at a random square and the passenger is at a random location. The taxi drives to the passenger's location, picks up the passenger, drives to the passenger's destination (another one of the four specified locations), and then drops off the passenger. Once the passenger is dropped off, the episode ends.
Observations:
There are 500 discrete states since there are 25 taxi positions, 5 possible locations of the passenger (including the case when the passenger is in the taxi), and 4 destination locations.
Passenger locations:
- 0: R(ed)
- 1: G(reen)
- 2: Y(ellow)
- 3: B(lue)
- 4: in taxi
Destinations:
- 0: R(ed)
- 1: G(reen)
- 2: Y(ellow)
- 3: B(lue)
Actions:
There are 6 discrete deterministic actions:
- 0: move south
- 1: move north
- 2: move east
- 3: move west
- 4: pickup passenger
- 5: dropoff passenger
Rewards:
There is a reward of -1 for each action and an additional reward of +20 for delivering the passenger. There is a reward of -10 for executing actions "pickup" and "dropoff" illegally.
"""
```
从上述代码可知,Taxi环境有500个离散状态,这是因为有25个出租车位置、5个乘客可能的位置(包括在出租车内的情况)和4个目的地位置。
##### 3.2 状态编码与解码
代码中还包含了状态的编码和解码函数:
```python
def encode(self, taxi_row, taxi_col, pass_loc, dest_idx):
# (5) 5, 5, 4
i = taxi_row
i *= 5
i += taxi_col
i *= 5
i += pass_loc
i *= 4
i += dest_idx
return i
def decode(self, i):
out = []
out.append(i % 4)
i = i // 4
out.append(i % 5)
i = i // 5
out.append(i % 5)
i = i // 5
out.append(i)
assert 0 <= i < 5
return reversed(out)
```
这两个函数用于将分层的状态转换为单个数值,实现了状态的分层表示。
#### 4. 理解分层状态
对于初学者来说,强化学习中状态的概念可能比较难理解。以FrozenLake环境为例,它有4×4的方格,即16个状态。Taxi环境也可以用类似的方式理解基础状态。
Taxi环境的状态是分层的:
- **第一层(导航)**:有25个状态,智能体刚开始处于这一层。
- **第二层(接送乘客)**:当智能体接到乘客后,状态进入这一层,有5个不同的导航层,共25×5 = 125个状态。
- **第三层(送达乘客)**:需要选择正确的送达地点,有4个送达地点,所以这一层共有125×4 = 500个状态。
可以通过减少不必要的动作和状态来缩小搜索空间,从而加快训练速度。例如,将搜索空间从3000个状态 - 动作值(500个状态×6个动作/状态)减少到约2000个。但这样做会限制智能体的灵活性。
下面是Taxi环境分层状态的mermaid流程图:
```mermaid
graph TD;
A[第一层:导航(25个状态)] --> B[第二层:接送乘客(125个状态)];
B --> C[第三层:送达乘客(500个状态)];
```
#### 5. 分层强化学习(HRL)学习状态层次结构
使用Q学习或期望SARSA算法教智能体驾驶出租车很有趣,但训练时间较长,因为智能体需要探索更多的状态。我们可以将其看作智能体状态,也被称为“选项”。
##### 5.1 半马尔可夫决策过程(semi - MDP)
以唤醒半马尔可夫决策过程为例,智能体可能处于三种不同的状态(早醒、准时、晚醒),每种状态下需要不同的解决方案。Taxi环境也是一个很好的半马尔可夫决策过程的例子,智能体有携带乘客和不携带乘客两种选项,每种选项下还有不同的子选项。
##### 5.2 Taxi环境的选项层次结构
下面是Taxi环境选项层次结构的表格:
| 选项 | 描述 | 子选项 |
| ---- | ---- | ---- |
| Get | 获得乘客 | Pickup, Navigate |
| Put | 放下乘客 | - |
| Pickup | 接送乘客 | - |
| Navigate | 导航 | Up, Right, Down, Left |
通过这种选项层次结构,我们可以看到学习的层次结构。分层强化学习(HRL)可以让智能体更有效地学习状态层次结构。
##### 5.3 HRL的优势
HRL的魅力在于可以将状态层次结构分解为智能体任务。如果能训练智能体完成特定任务,这个任务可以作为子集用于更复杂的问题。就像我们日常出门散步,不需要每次都重新学习系鞋带,因为系鞋带这个子任务已经被掌握。
然而,HRL不像深度强化学习那样受到广泛关注。深度强化学习更具视觉冲击力,能解决非常复杂的任务,而HRL和状态抽象更注重重用和解决更大的问题。近年来,HRL结合深度学习变得更加复杂,我们这里主要介绍一些基础的HRL形式。
#### 6. 使用MAXQ进行功能分解
为了解决状态层次结构问题,我们可以假设层次结构中的每个状态都有最优奖励/目标。因此,分解每个子状态并求解,就可以得到整个问题的解决方案。这就是MAXQ - 0方法,“0”表示没有抽象,需要直接解决问题。MAXQ - Q是更高形式的方法,即带有状态抽象的MAXQ。
##### 6.1 代码示例
我们通过以下步骤来实现MAXQ - 0方法:
1. **打开`Chapter_8_Taxi_MAXQ.ipynb`文件**:查看导入模块后的第二个代码单元,开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开始开
0
0
复制全文
相关推荐










