文章目录(Table of Contents)
简介
这里介绍一个 OpenAI
中的环境,MountainCar-v0
。该环境是一辆汽车在一维轨道上,位于两座「山」之间。目标是在右边开车上山;然而,这辆车的引擎不够强劲,无法一次性翻越这座山。因此,成功的唯一方法是来回驱动
以积聚动力。
参考资料
- OpenAI 中对该环境(
MountainCar
)的介绍,OpenAI MountainCar 介绍 - 这一篇所有的示例代码都放在了
GitHub
的仓库,MountainCar 介绍 - OpenAI Gym 的介绍,Reinforcement Learning(强化学习)-Gym 使用介绍
MountainCar 环境介绍
Action 与 Observation 介绍
在 MountainCar-v0
环境中,action
是离散值,有三个不同的选项,分别是 0 表示「向左行驶」,1 表示「停止」,2 表示「向右行驶」。我们可以用下面的 dict
来表示:
- actions = {'left': 0, 'stop': 1, 'right': 2}
Observation
由两个值表示,分别是 position
, velocity
,表示「小车当前的位置」和「小车当前的速度」。其中:
- 关于
position
,最左侧的位置为-1.2
,最右侧的值为0.6
,谷底是-0.5
。 - 关于
velocity
,向右侧行驶速度为「正」,左侧为「负」。这里速度的取值为[-0.07, 0.07]
;
使用 Toy Policy 完成任务
我们尝试定义一个非常简单的策略,来帮助小车达到「右侧山顶」。策略整体的思路很简单:
- 当小车在向右移动的时候
- 当到达「右侧一定高度」,且无法继续上升的时候,则向左移动;
- 其他时候都向右移动;
- 当小车向左移动的时候:
- 当到达「左侧一定高度」,且无法继续上升的时候,则向右移动;
- 其他时候都向左移动;
于是根据上面的思路我们可以完成下面的策略:
- def policy(obs, t):
- actions = {'left': 0, 'stop': 1, 'right': 2}
- position, velocity = obs
- # 相当于可以左右运动, 利用惯性使得车辆向上移动
- if velocity>=0: # velocity>=0 表示车辆正在向右移动
- if (position>-0.5) and (abs(velocity)<0.01): # 当到达右侧一定位置无法向右时, 则向左
- return actions['left']
- else:
- return actions['right']
- elif velocity<0: # velocity<0 表示车辆正在向左移动
- if (position<-0.7) and (abs(velocity)<0.01): # 当到达左侧一定位置无法向左时, 则向右
- return actions['right']
- else:
- return actions['left']
我们尝试使用上面的策略与环境进行交互:
- obs = env.reset()
- TIME_LIMIT = 200
- for t in range(TIME_LIMIT):
- action = policy(obs, t) # Call your policy
- obs, reward, done, _ = env.step(action) # Pass the action chosen by the policy to the environment
- env.render()
- if done:
- print("Well done!")
- break
- else:
- print("Time limit exceeded. Try again.")
最终的效果如下所示,可以看到车辆最终达到「右侧山顶」:
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论