python强化学习实例:寻路Q-Learn演示

这篇具有很好参考价值的文章主要介绍了python强化学习实例:寻路Q-Learn演示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python强化学习-寻路Q-Learn演示

1. 简介

项目包含的所有资源已经上传到GitHub,欢迎访问:https://github.com/BlueShark002/QLearn

1.1 项目简介

这是一个关于Q-Learn的寻路项目。我构建了一个方块MxN的“世界”,里面一共有四个元素:

  1. “ P ” 玩家;
  2. “ X ” 陷阱;
  3. “ E ” 终点;
  4. “ ” 空地点,玩家可以自由出入。

玩家会在这个方块的小世界里按Q表移动,到达终点“E”即游戏胜利,到达"X"游戏结束。通过给与玩家的每一次移动不同的奖励,来规正玩家到达终点的路线。玩家踩到陷阱奖励-100分,到达终点奖励100分,到达空方块奖励-1分 。如下所示:
python强化学习实例:寻路Q-Learn演示

1.2 运行方式

src目录下有两个主要的py文件,QLearn.pydisplay.py,这是两个不同画面表现的脚本,QLearn.py只拥有命令行下的字符界面;display.py在前者的基础上利用pygame增加了可视化窗口,可以实时看到玩家采取下一动作的可能性,箭头越红表示玩家越有可能去箭头指向地点,如下所示:

python强化学习实例:寻路Q-Learn演示


在脚本所在目录命令行输入如下指令即可运行:

  1. python QLearn.py
  2. python display.py

第一次运行,将会在工作目录下得到一个mapPosMxN.txt文件,里面以json格式储存了Q table里的数值。M 表示列数,N表示行数,每一次改变行列大小都会得到一个新的json文件。

1.3 参考

  1. 手把手教你实现Qlearning算法[实战篇](附代码及代码分析)

2 Q-Learn

2.1 简介

Q-Learn是强化学习的一种算法。通过穷尽状态来描述智能体,在当前状态下执行某一行为或动作后,状态会朝着下一状态转变,因此下一状态发生与否取决当前状态,这些状态之间彼此关联。Q-Learn就是通过维护这样一个状态-动作的评估表来判断当前状态下执行何种动作的效用最高,从而选定该动作执行。每一个状态下都有若干动作,好比一张二维的表格,行表示状态,列表示动作,行列即是该行状态下该列动作的效用评估大小,如下图所示:

python强化学习实例:寻路Q-Learn演示

那么这些评估值如何设置?

这些评估值,根据你给予的奖励和状态之间转移确定,初始时你可以随机给出这些值,在玩家每一次移动后都要对其进行更新,这样奖励为正的行为将会得到加强,奖励为负的将会得到抑制,更新公式如下:
Q ( S , A ) = Q ( S , A ) + α [ R + γ m a x a ( S ′ , a ) − Q ( S , A ) ] Q(S,A) = Q(S, A) + \alpha[R+\gamma max_a(S', a) - Q(S, A)] Q(S,A)=Q(S,A)+α[R+γmaxa(S,a)Q(S,A)]
Q(S,A)表示当前状态动作下对应的Q表中的值,alpha gamma0-1常量,***maxa(S’,a)***表示执行动作a后能到达的下一状态的q值最大,这里就是用于找到能使下一状态-动作q值最大的动作aR是处于当前状态的奖励大小。


状态的理解和定义?

状态要根据你设计的项目来理解和定义。对于智能体来说状态就是对“环境的感知”,比如吃豆人游戏里,鬼魂的位置,玩家自己的位置,豆子的位置就是几个比较重的感知元素,智能体将这些感知元素作为对世界的理解,这些元素通过和奖励措施的有机结合在对玩家不断的训练下,智能体渐渐表现出了符合游戏规则努力获胜的行为,就像一个人类玩家那样,懂得躲避鬼魂,吞吃豆子等。有的时候我们甚至会把智能体所处环境的全部信息作为状态,比如棋盘类游戏,在象棋里我们就需要把棋盘上当前所有棋子的类型和位置作为状态来定义。

以上两个举例分别是对环境的有限感知和全部感知而且状态是离散的,连续的环境值可以通过分段切割成离散的小区间来近似离散表示。

总之,一个好的状态定义需要结合游戏规则,并实施适合的奖励措施,能对环境做出准确的描述帮助智能体符合获胜的趋势,形式根据项目的不同往往是多种多样的

2.2 项目里的Q表

项目里的Q表我采用的是python字典数据结构,键为(X,Y)action的字符,(X,Y)表示玩家当前所在的位置坐标,action表示上一次执行的动作,这里会与直觉矛盾,我这么设计是出于方便更新Q表的目的。

3. 演示

以下演示为display.py运行后的界面,左边是字符打印,右面是pygame界面,箭头的颜色从深蓝到深红表示,去往下一地点的可能性从越低到越高,颜色越红表示玩家越有可能进入指向的目的点。

演示参数:

  1. 界面大小:7x7
  2. 玩家起点在(0, 3)
  3. 终点在(5, 5)
  4. 陷阱在(5, 4) (5, 6)

python强化学习实例:寻路Q-Learn演示

开始时,玩家不断探索,对于空白地点,奖励为-1值,于是降低向此地点移动的可能,导致其他地点被探索的可能性增加,如上图所示,开始时大部分地区的指向都为红色,经过一段时间的探索,这些非终点指向的地点被降低了探索的价值,最后程序逐渐找到了一条合适的道路。

4. 后记

Q-Learn的缺点也是显而易见的,对于存在大量状态的空间,维护一个Q表往往比较困难,同时对于连续的状态空间,Q-Learn也会比较吃力。

让我们回到项目中来,我们只聚焦于两个状态,当前和之后,因此在起点到终点这条道路上只有指向终点最后的那个“箭头”得到加强,其他都是减弱的,因为我们对于空白方块的奖励较小,即使经过多次探索,它仍然具有比周边更大的探索价值,因此在后面的每一局中,玩家都保持着相同的路径,如果加大惩罚力度,比如-20,玩家花在路上的步数会更多,最终仍会找到终点。假设玩家从A点开始在到达E点的过程如下:
python强化学习实例:寻路Q-Learn演示

我们的奖励措施只会加强从D到E这个过程,也就是说只要玩家到达D后,即使D点周边有许多其他地点,玩家也会毫不犹豫地进入E。我们理应上要对整条路径进行加强,如果这条路径是最短的路径,那也没什么问题,可是如果不是的话,我们的整体加强会失去其他路径,可能会错过最短路径。我们可以通过记录下不同的路径,达到迭代次数后筛出最短的路径来解决这个问题。另外也可以计算路径上总的奖励,再均分给路径上的节点进行整体的奖励,这样理论上节点数越少,得到的平均奖励也就越多。因此,状态的表示,奖励的选择,是强化学习里比较重要的两个点

实际上当前状态甚至会有可能影响甚至决定了未来的状态,就像在周期较长的实验过程中,前期准备了许多,期间实验体经过不同阶段的生长发育变化,临近结束时,可能会因为前期准备中的失误而功亏一篑。状态之间复杂难名的关系,也是AI的一个挑战。另外,在一个分支巨大的状态搜索空间中,不同的策略组合,不同的组合数,都会穷尽当前计算机的算力,这也加大了对长状态预测的困难,比如围棋就是一个具有巨大分支状态的项目,目前比较好的解决办法是“蒙特卡洛树搜索(MCTS)”,并不穷尽所有,只是选择几种可能的方式,进行一定深度的推演等。

在我看来,目前人工智能还有很长的路要走,我关注的还是游戏AI方面的知识,希望能做出一个强力的Boss

谢谢各位,如有错误,敬请指正文章来源地址https://www.toymoban.com/news/detail-402417.html

到了这里,关于python强化学习实例:寻路Q-Learn演示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • chatgpt赋能python:Python列表转字符串:最全方法介绍和实例演示

    在Python编程中,列表(list)是非常重要的数据类型之一,它可以存放任意类型的数据,包括数字、字符串、布尔值等,还可以嵌套其他列表,是一种非常灵活的数据结构。 然而,在Python编程实践中,我们常常需要将列表转换为字符串。比如需要将列表转换为JSON格式,以便进行

    2024年02月08日
    浏览(56)
  • Python操作excel进行插入、删除行操作实例演示,利用xlwings库实现

    插入行演示采用正序遍历操作,直接使用 xlwings 提供的 sheet.api.Rows(\\\"行数\\\").Insert() 方法就能实现整行插入处理。 需要注意的是 ,如果是前插入,要避免再次检测到刚才匹配过的内容,以防循环反复插入原位置。 调整前: 处理过程: 调整后: 删除行演示采用逆序遍历操作,

    2023年04月08日
    浏览(37)
  • Python使用正则表达式识别代码中的中文、英文和数字实例演示

    在文本处理和数据分析中,有时候需要从代码中提取出其中包含的中文、英文和数字信息。正则表达式是一种强大的工具,可以帮助我们实现这一目标。本文将分三个部分详细介绍如何使用正则表达式在 Python 中识别代码中的中文、英文和数字。 在 Python 中,可以使用 Unicod

    2024年02月14日
    浏览(52)
  • 【python】scikit-learn包:机器学习

    只支持python语言 Win+R ,输入指令: pip install -U scikit-learn 借助pandas和numpy 进行数据导入与处理 机器学习的函数大部分只能对数字信息进行处理,无法对string类数据进行分析,因此需要将string类信息进行编码数字化 参考blog链接,可进行补码 给定数据集 [x1,x2,x3,…,y],拟合y与各

    2024年02月01日
    浏览(40)
  • Python数据科学:Scikit-Learn机器学习

    Scikit-Learn使用的数据表示:二维网格数据表 鸢尾花数据集说明: sepal_length:萼片长度 sepal_width:萼片宽度 petal_length:花瓣长度 petal_width:花瓣宽度 species:鸢尾花类型,Iris-setosa(山鸢尾),Iris-versicolor(变色鸢尾),Iris-virginica(维吉尼亚鸢尾) df_iris.head() 样本:鸢尾花数据集矩阵,矩阵

    2024年02月21日
    浏览(50)
  • 探索 Scikit-learn:Python 机器学习初级篇

    Scikit-learn 是 Python 中最著名的机器学习库之一,它提供了大量实用的机器学习算法以及相关的工具,可以方便我们进行数据挖掘和数据分析。在这篇文章中,我们将介绍 Scikit-learn 的基本使用,包括如何导入数据、预处理数据、选择和训练模型,以及评估模型的性能。 在使用

    2024年02月17日
    浏览(41)
  • Python机器学习:Scikit-learn库与应用

    当涉及到Python机器学习时,Scikit-learn是一个非常流行且功能强大的库。它提供了广泛的算法和工具,使得机器学习变得简单而高效。下面是一个简单的Scikit-learn库与应用示例,其中包括代码。 首先,确保你已经安装了Scikit-learn库。你可以使用pip命令来安装它: bash复制代码

    2024年02月19日
    浏览(48)
  • 掌握 Scikit-Learn: Python 中的机器学习库入门

    机器学习 (Machine Learning) 是一个近年来频繁出现在科技新闻, 研究报告, 行业分析和实际应用中的热门领域. 机器学习 (Machine Learning) 正以前所未有的速度影响着我们的生活. 从智能音响的语音识别, 手机摄像头的人脸解锁, 到金融领域的评估, 医疗健康的预测分析. 机器学习的应

    2024年02月07日
    浏览(52)
  • 【Python】强化学习:原理与Python实战

    搞懂大模型的智能基因,RLHF系统设计关键问答   RLHF(Reinforcement Learning with Human Feedback,人类反馈强化学习)虽是热门概念,并非包治百病的万用仙丹。本问答探讨RLHF的适用范围、优缺点和可能遇到的问题,供RLHF系统设计者参考。 📕作者简介: 热爱跑步的恒川 ,致力于

    2024年02月11日
    浏览(47)
  • 大数据机器学习深入Scikit-learn:掌握Python最强大的机器学习库

    本篇博客详细介绍了Python机器学习库Scikit-learn的使用方法和主要特性。内容涵盖了如何安装和配置Scikit-learn,Scikit-learn的主要特性,如何进行数据预处理,如何使用监督学习和无监督学习算法,以及如何评估模型和进行参数调优。本文旨在帮助读者深入理解Scikit-learn,并有效

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包