首页 > 其他 > 详细

Reinforcement Learning 笔记(2)

时间:2020-03-03 23:27:34      阅读:76      评论:0      收藏:0      [点我收藏+]

继续莫烦的教程,这次是迷宫。

与前面的简单例子相比,迷宫的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()放在学习过程之后,就可避免类似问题.

Reinforcement Learning 笔记(2)

原文:https://www.cnblogs.com/aitashi/p/12370091.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!