# Mountain Car的环境分析

环境是强化学习中非常重要的一部分.在平时的学习中我们可能很少去关注环境, 但是你要知道,在面对一个实际的强化学习问题的时候我们是需要自己编写环境的。 今天我们就来看看我们常常会用到的过山车的环境背后都有些什么。 如果你想要了解更多请看https://www.way2ml.com/ml/RL_Practice/a_start_to_use_Gym.html

首先我们画出MountainCar的轨道,这个轨道可不是随便画的一条线,它是有解析解的

h=0.45sin(3x)+0.55h = 0.45\sin(3x)+0.55

import numpy as np
import matplotlib.pyplot as plt
import os 

save_path = './img/'
if not os.path.exists(save_path): 
    os.mkdir(save_path)

SIZE = 1.5
plt.figure(figsize=(SIZE*6,SIZE*4))
plt.xlabel('x') 
plt.title('Mountain Car Track')
plt.xlim(-1.2,0.6)
x = np.linspace(-1.2,0.6,100)
plt.plot(x, np.sin(3*x)*0.45 + 0.55, 'k-',lw=2,label='h=sin(3x)*0.45 + 0.55')
plt.legend(loc='upper left')
plt.grid() 
plt.savefig(os.path.join(save_path,'MountainCarTrack'))
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

环境的信息

  • 轨道的表达式h=0.45sin(3x)+0.55h = 0.45\sin(3x)+0.55;
  • 车的质量m=1m=1;
  • 车受到的重力gravity=0.0025\text{gravity} = 0.0025;
  • 位置xx的范围[1.2,0.5][-1.2, 0.5];
  • 速度vv的范围[0.07,0.07][-0.07,0.07];
  • 智能体在任意时刻tt可采取的动作At{0,1,2}A_t \in \{0,1,2\};
  • 智能体的驱动力为f=(At1)0.001f = (A_t - 1)*0.001;
  • 智能体的状态(x,v)(x,v)
  • 终点位置x=0.5x=0.5

新状态通过下面的关系得到,其中bound\text{bound}的意思是将值限定在xx,vv上面提到的规定范围内:

vt+1bound[vt+0.001(At1)0.0025cos(3xt)]v_{t+1} \doteq \text{bound}[v_t + 0.001(A_t-1) - 0.0025\cos(3x_t)]

xt+1bound[xt+vt+1]x_{t+1} \doteq \text{bound}[x_{t} + v_{t+1}]

思考

vv的递推关系来看, 我们可以认为速度vv的方向是沿着轨道的; 接下来我们认为小车的驱动力ff的方向也是沿着轨道的。

然后我们分析将重力分解,可以得到0.0025cos(3xt)0.0025\cos(3x_t),方向和正方向相反,因此我们前面加个-号。

你可能会问为什么轨道方向和重力方向的夹角是3xt3x_t, 你看看下面这张图可能就不会纠结了:

除了轨道外,我还画了cos(3x)\cos(3x)的图像(对应绿色线),这条曲线的纵坐标反应了重力在轨道方向上的分力的大小

例如在x=0.5x=-0.5附近,也就是谷底时,重力在轨道方向的分力为00, 其他位置类似。

到这里好像都没有任何的问题,但是我们再看位置的递推公式:

xt+1bound[xt+vt+1]x_{t+1} \doteq \text{bound}[x_{t} + v_{t+1}]

这里很明显是考虑的水平位置, 那速度也应该使用水平速度才对, 但这里却直接使用了沿着轨道的速度vt+1v_{t+1}, 因此我认为这里是有问题的。

但可能这点问题影响不大吧。你怎么看呢? 欢迎下方留言告诉我。

总结

这个环境模型的智能体(agent)是通过自身的动作(action),间接改变了它的观测(state)。

即使智能体不做任何动作, 在山坡上它的观测(state)也会发生变化

完整的环境代码在这里

Mountain Car OpenAI wiki OpenAI Mountain Car Wikipedia: Mountain car problem