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

  • 相关阅读:
    再学 GDI+[38]: 文本输出 DrawString、TGPFont
    再学 GDI+[42]: 文本输出 字号单位
    再学 GDI+[41]: 文本输出 控制输出字符的个数
    再学 GDI+[45]: 文本输出 文本呈现质量
    博客园电子期刊2008年11月半月刊(上)发布啦
    博客园电子期刊2008年12月●半月刊(上)发布啦
    招聘频道功能更新:RSS订阅
    博客园新版招聘频道(job.cnblogs.com)上线测试啦
    《悟透JavaScript》到货了
    博客园电子期刊2008年11月●半月刊(下)发布啦
  • 原文地址:https://www.cnblogs.com/aitashi/p/12370091.html
Copyright © 2011-2022 走看看