zoukankan      html  css  js  c++  java
  • 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
    ', state_action)
    13             print('state_action == np.max(state_action)
    ', state_action == np.max(state_action))
    14             print('state_action[state_action == np.max(state_action)]
    ', state_action[state_action == np.max(state_action)])
    15             print('state_action[state_action == np.max(state_action)].index
    ', 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()放在学习过程之后,就可避免类似问题.

  • 相关阅读:
    js公共时间戳方法es6
    vue权限路由
    vue中websocket心跳写法
    vue引入全局组件和局部组件的区别以及全局注册公共函数
    [干货]关于vue作用域插槽的新的深入理解
    vue系统指令v-text(前端网备份)
    浏览器兼容html头部<meta>标签主要内容详情
    如何设置td中溢出内容的隐藏显示
    7-4列表/元组/字典/集合的内置方法
    7-3 整型/浮点型/字符串/列表常用方法
  • 原文地址:https://www.cnblogs.com/aitashi/p/12370091.html
Copyright © 2011-2022 走看看