强化学习 Q-learning及python例子

系统 2258 0

文章目录

  • Q-learning原理
  • python例子

本文是作者在学习莫烦的强化学习课程中的笔记,强烈推荐 莫烦强化学习。

Q-learning原理

我们以一个走迷宫的小游戏为例:让探索者学会走迷宫. 黄色的是天堂 (reward 1), 黑色的地狱 (reward -1). 大多数 RL 是由 reward 导向的, 所以定义 reward 是 RL 中比较重要的一点.

强化学习 Q-learning及python例子_第1张图片
Q-learning原理实际上就是建立一个Q表(最本文最后有展示),里面包含所有状态下、不同动作的Q值(最终根据Q值走出迷宫),Q-learning通过不断尝试每个回合、每一步,不断的更新Q表,最终达到最优的状态。
强化学习 Q-learning及python例子_第2张图片
整个算法就是一直不断更新 Q table 里的值, 然后再根据新的值来判断要在某个 state 采取怎样的 action. Qlearning 是一个 off-policy 的算法, 因为里面的 max action 让 Q table 的更新可以不基于正在经历的经验(可以是现在学习着很久以前的经验,甚至是学习他人的经验). 不过这一次的例子, 我们没有运用到 off-policy, 而是把 Qlearning 用在了 on-policy 上, 也就是现学现卖, 将现在经历的直接当场学习并运用. On-policy 和 off-policy 的差别我们会在之后的 Deep Q network (off-policy) 学习中见识到. 而之后的教程也会讲到一个 on-policy (Sarsa) 的形式, 我们之后再对比。

python例子

首先我们先 import 两个模块, maze_env 是我们的环境模块, 已经编写好了, 大家可以直接在这里下载, maze_env 模块我们可以不深入研究, 如果你对编辑环境感兴趣, 可以去看看如何使用 python 自带的简单 GUI 模块 tkinter 来编写虚拟环境. maze_env 就是用 tkinter 编写的. 而 RL_brain 这个模块是 RL 的大脑部分.

            
              
                from
              
               maze_env 
              
                import
              
               Maze

              
                from
              
               RL_brain 
              
                import
              
               QLearningTable

            
          

下面的代码, 我们可以根据上面的图片中的算法对应起来, 这就是整个 Qlearning 最重要的迭代更新部分啦.

            
              
                def
              
              
                update
              
              
                (
              
              
                )
              
              
                :
              
              
                # 学习 100 回合
              
              
                for
              
               episode 
              
                in
              
              
                range
              
              
                (
              
              
                100
              
              
                )
              
              
                :
              
              
                # 初始化 state 的观测值
              
              
        observation 
              
                =
              
               env
              
                .
              
              reset
              
                (
              
              
                )
              
              
                while
              
              
                True
              
              
                :
              
              
                # 更新可视化环境
              
              
            env
              
                .
              
              render
              
                (
              
              
                )
              
              
                # RL 大脑根据 state 的观测值挑选 action
              
              
            action 
              
                =
              
               RL
              
                .
              
              choose_action
              
                (
              
              
                str
              
              
                (
              
              observation
              
                )
              
              
                )
              
              
                # 探索者在环境中实施这个 action, 并得到环境返回的下一个 state 观测值, reward 和 done (是否是掉下地狱或者升上天堂)
              
              
            observation_
              
                ,
              
               reward
              
                ,
              
               done 
              
                =
              
               env
              
                .
              
              step
              
                (
              
              action
              
                )
              
              
                # RL 从这个序列 (state, action, reward, state_) 中学习
              
              
            RL
              
                .
              
              learn
              
                (
              
              
                str
              
              
                (
              
              observation
              
                )
              
              
                ,
              
               action
              
                ,
              
               reward
              
                ,
              
              
                str
              
              
                (
              
              observation_
              
                )
              
              
                )
              
              
                # 将下一个 state 的值传到下一次循环
              
              
            observation 
              
                =
              
               observation_
            
              
                # 如果掉下地狱或者升上天堂, 这回合就结束了
              
              
                if
              
               done
              
                :
              
              
                break
              
              
                # 结束游戏并关闭窗口
              
              
                print
              
              
                (
              
              
                'game over'
              
              
                )
              
              
    env
              
                .
              
              destroy
              
                (
              
              
                )
              
              
                if
              
               __name__ 
              
                ==
              
              
                "__main__"
              
              
                :
              
              
                # 定义环境 env 和 RL 方式
              
              
    env 
              
                =
              
               Maze
              
                (
              
              
                )
              
              
    RL 
              
                =
              
               QLearningTable
              
                (
              
              actions
              
                =
              
              
                list
              
              
                (
              
              
                range
              
              
                (
              
              env
              
                .
              
              n_actions
              
                )
              
              
                )
              
              
                )
              
              
                # 开始可视化环境 env
              
              
    env
              
                .
              
              after
              
                (
              
              
                100
              
              
                ,
              
               update
              
                )
              
              
    env
              
                .
              
              mainloop
              
                (
              
              
                )
              
            
          

迷宫中各个状态的位置:

强化学习 Q-learning及python例子_第3张图片
最终学到的Q表:
强化学习 Q-learning及python例子_第4张图片


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论