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()放在学习过程之后,就可避免类似问题.

posted @ 2020-03-03 22:13  Aitashi  阅读(347)  评论(0编辑  收藏  举报