Reinforcement Learning 笔记(2)
继续莫烦的教程,这次是迷宫。
与前面的简单例子相比,迷宫的action有四个方向,reward有正有负,整体情况复杂了许多
tkinter是python3中自带的GUI库,在windows下无需手动安装,在linux则不然,需要手动安装python3-tk与tk-dev包才能被python捕捉的
此处与上个例子的显著不同是,本例子中,table的大小是可变的,需要随着探索随时扩充.
在RL_brain.py中,此处的choice列表的获得方式很有趣.
1 def choose_action(self, observation): 2 self.check_state_exist(observation) 3 # action selection 4 # d 5 if np.random.uniform() < self.epsilon: 6 # choose best action 7 state_action = self.q_table.loc[observation, :] 8 # some actions may have the same value, randomly choose on in these actions 9 #### 10 state_action[1,2]=1 11 action = np.random.choice(state_action[state_action == np.max(state_action)].index) 12 print('state_action\n', state_action) 13 print('state_action == np.max(state_action)\n', state_action == np.max(state_action)) 14 print('state_action[state_action == np.max(state_action)]\n', state_action[state_action == np.max(state_action)]) 15 print('state_action[state_action == np.max(state_action)].index\n', state_action[state_action == np.max(state_action)].index) 16 else: 17 # choose random action 18 action = np.random.choice(self.actions) 19 return action
(做了一点修改,给了一个初始化的最大值)
observation是当前的观察,即获得当前所在的"位置",单后在q_table中检索其可能的行动的对应权值.
以下是输出情况:
state_action
0 0.0
1 1.0
2 1.0
3 0.0
Name: [5.0, 5.0, 35.0, 35.0], dtype: float64
state_action == np.max(state_action)
0 False
1 True
2 True
3 False
Name: [5.0, 5.0, 35.0, 35.0], dtype: bool
state_action[state_action == np.max(state_action)]
1 1.0
2 1.0
Name: [5.0, 5.0, 35.0, 35.0], dtype: float64
state_action[state_action == np.max(state_action)].index
Int64Index([1, 2], dtype='int64')
结合以上两个输出可以看到判断语句(state_action == np.max(state_action))返回了一个pd.DataFrame,而这个DataFrame(一维)作为索引,将state_action中最大的值(一个或多个)截取,然后再通过.index方法获得其索引值(序列).由于可能有多个"最大值"(即多个值相同,且均为最大),所以才需要这样看上去十分麻烦的方法来获得一个"最大值"的索引.
而常见的思路是 通过某种find函数,直接根据值来回溯索引(如js,matlab等)
注意,这和视频中的代码有所不同.
而learn函数与之前的例子类似.只不过因为q_table是动态拓展的,需要一个check函数进行判断更新.
而实际的移动,和观察,都是env(环境)层面的内容,与学习过程无关.学习过程只关心获得反馈,并采取行动.
故类似于走到边沿方向受限,四个方向如何定义等部分,都在env中设定.
实际上运行的时候,走到终点(黄色)的前一格会无法显示,实际上是因为env的更新显示是在循环开头(run_this.py),而学习和移动在后面,所以实际上,当显示更新之前,已经走到了下面一格,而到了终点的时候,会立刻退出,无法进行最后一次渲染更新位置.如果把env.render()放在学习过程之后,就可避免类似问题.