迷宫求解之Python

迷宫求解 一,必做任务一 使用强化学习算法,对于给定的迷宫,训练老鼠在迷宫中寻找蛋糕, 迷宫与图中类似,黑色格子为墙,不能走,老鼠试图走向墙时,会停在原地

本文包含相关资料包-----> 点击直达获取<-------

迷宫求解

一、必做任务一

使用强化学习算法,对于给定的迷宫,训练老鼠在迷宫中寻找蛋糕。

迷宫与图中类似,黑色格子为墙,不能走,老鼠试图走向墙时,会停在原地。白色格子为空地,可以走。黄色圆圈标志老鼠走过的格子,五角星为老鼠所在位置。起始位置为左上角,结束位置为右下角。

二、必做任务二

自行生成不同迷宫(尺寸、地图),完成前述操作。

我对这个任务的理解是:程序中事先定义好了一些不同大小和样式的迷宫,供用户挑选,此外,用户也可以自己定义迷宫。

三、必做任务三

若迷宫中存在老鼠夹子,且位置固定,完成前述操作。

如图,红色方格代表陷阱,即老鼠夹子。与黑色方格的墙不同,老鼠可以走向陷阱,而一旦走入陷阱,游戏失败。

四、选做任务一

考虑时变因素,如迷宫的某些格子会周期性产生火焰。

如图,红色三角为火焰,和陷阱相同,老鼠可以走向火焰,但一旦走入就会导致游戏失败。

设老鼠每走一步的时间为一个时间单位,火焰在一个周期时间(偶数个时间单位)内的后半段出现,前半段不出现。比如火焰周期为 4,老鼠走两步,火焰出现,再走两步,火焰消失。火焰周期可在用户自定义界面由用户定义。

五、问题建模

5.1 迷宫

迷宫用一个二维数组建模,数组中的每个数代表一个方格,数字值代表方格类型(如 0 表示墙, 2 表示陷阱, 3 表示火)。

迷宫是强化学习中的“环境”,老鼠在迷宫中每走一步(采取一个动作),迷宫会返回一个 reward,游戏状态(输或赢),以及老鼠下一个位置。

reward 基本都是负值,除了到达终点的动作。

动作 Reward
移动 -0.05
撞墙 -0.85
重复走过的格子 -0.3
死亡(陷阱或火焰) -2
到达终点 1

之所以将移动的 reward 设为负值,是为了减少老鼠的路线长度,尽快到达终点。

为防止游戏无止境地进行下去,当 reward 积累到足够小时,游戏也会结束。

5.2 表模型

使用 Q-learning 算法进行训练,就是要得到 Q 表:行动价值函数,对每一个状态的每个动作都有一个行动价值与其对应,做决策时选择当前状态下行动价值最高的动作。

动作:向上下左右四个方向前进。

状态:老鼠所在的格子(引入时间因素后还有考虑时间)。

下图是可视化的 Q 表,从每个状态的四个动作中选出 Q 值最大的一个,用箭头画出来,颜色表示 Q 值大小,从红到绿 Q 值越来越大。

5.3 监督学习模型

除 Q 表模型外,我们也尝试了使用监督学习模型进行预测,将 1 中提到的代表迷宫的二维数组变成一维向量,输入到全连接网络中,网络输出 1 × 4 大小的向量,分别表示四个动作的 Q 值。

使用监督学习模型进行训练时,需要使用批量式价值近似方法。把训练数据存到一个库里,训练时从库里拿一批数据出来训练,即经验回放。注意库的大小有限,库满时删除旧数据,加入新数据。

5.4 -learning 学习过程

Q-learning 是一种离线策略学习的方法,行为策略采用-贪心策略,有利于进行探索,目标策略采用贪心策略,有利于充分利用学到的经验。

具体学习过程如下,在老鼠处于状态 state 时,首先基于当前 Q 表采用-贪心策略进行预测,选择一个动作,采取该动作,从”环境”中得到反馈:下一状态 +1, 回馈 +1, 游戏状态(输赢)game_status。再采用贪心策略对下一状态 +1 进行预测,得到 Q(+1, +1),使用时序差分方法对 Q 表进行更新:

, ) Q(, ) + [+1 + Q(+1, +1) Q(, )]

在每一局游戏的每一步移动都重复上面的步骤,直到游戏结束,一轮游戏叫做一个 epoch。训练会在足够多 epoch 后,或 Q 表足够完善时停止。

5.5 加入时间因子

选做任务中要求火焰周期性变化,因此我们需要在状态中加入时间维度,Q 表也会发生响应的变化。

迷宫问题符合马尔可夫过程的定义,即当前状态下的决策与之前的步骤无关。加入时间因子后也是如此,当前状态下,即考虑时间和老鼠的位置,进行的决策与过去的步骤无关。因此时间因子不是无限大的,但又因为“环境”的反馈与时间有关,所以需要考虑一个周期内的时间因子即可。比如火焰出现周期为 4,则时间变量的取值范围为 0,1,2,3,变化规律为:0 → 1 → 2 → 3 → 0 → 1 → 2 …

在不加入时间因子时,状态由一个二元组表示(x,y),即老鼠的坐标;加入时间因子后,状态由三元组表示(x,y,t)。Q 表也会扩大规模,比如火焰周期为 4 时,Q 表规模会变为原来的 4 倍。

下图是周期为 2 时 Q 表的可视化结果,每个坐标点有两个 Q 值,分别对应时间 0 和时间 1,时间 t 为 1 时火焰出现。

六、算法设计和代码

使用 Q 表模型时,核心算法主要有两个类:迷宫(环境)和 Q 表。我们将 Q 表的存储,

预测,训练等放在一个类中实现。除此之外还有可视化,用户界面等代码中的类。

6.1 迷宫类

  • 迷宫信息用一个二维数组表示,数组中的每个数代表一个方格,数字值代表方格类型(如
  • 表示墙, 2 表示陷阱, 3 表示火)。
  • 迷宫类接收决策动作,给出对应的反馈:下一状态 +1, 回馈 +1, 游戏状态(输赢) game_status。

6.2 表模型类

表类有 Q 值的存储,决策的进行,Q 表的学习等功能函数,进行预测和学习时会与迷宫(“环境”)进行交互,对其输入动作,得到反馈。

七、UI 设计和使用说明

UI 界面使用 pyqt 设计,虽然不方便使用拖放组件的方式设计,但纯编程的设计自由度更高,让我得以实现像用户自定义图形这样的复杂操作。UI 的最高层是一个 QMainWindow 组件,里面有一个标签页,包含三个标签,分别是:“已有迷宫”和“用户自定义”。

7.1 已有迷宫界面

已有迷宫界面允许用户从我们定义好的几个迷宫中选择一个,进行训练并查看完整的走迷宫过程。由于我们已经训练并存储好了这些迷宫的 Q 表,用户也可以不进行训练,直接查看走迷宫过程。

用户可以选择迷宫过程的播放速度,界面左面两个分别是可视化的 Q 表和走迷宫的路线。用户可以从 6 种迷宫中任选其一,6 种迷宫包括 2 种尺寸,3 种类型。3 种类型分别是:只有墙,有墙和陷阱,有火焰。火焰的周期默认为 2.

7.2 用户自定义

在用户自定义界面,用户可以输入任意大小的迷宫,自定义火焰周期,训练次数上限。之后进行训练,并以三种不同的速度查看完整的走迷宫结果。下面的 Q 表还没有经过训练,所以所有 4 个方向的 Q 值相等。

八、总结

本次大作业我尝试了 Q 表模型和监督学习模型。

一开始我直观地认为监督学习模型更好,但完成后才发现其训练速度慢,且算法复杂。于是我又实现了 Q 表模型,训练速度很快,且算法直观。这让我体会到分析问题和文献调研的重要性,对不同的问题要用不同的解决方法,从难到易,杀鸡不用宰牛刀。

我完成了三个必做任务和选做任务,并设计了 UI 界面。此外,用户在 UI 界面有很大的自由度,可以自定义迷宫和迷宫参数。

虽然这次大作业花了我较长时间,尝试了两种方案,但体会到了独立完成一个完整项目的乐趣,收获了成就感,不仅提高了我的编程能力,加深了我对强化学习的理解,还提高了我解决问题的能力以及抗压能力,收获满满,也算是付出得到了回报。

参考文献

  • 基于Struts架构模式的人才招聘网站开发(大连交通大学·张春国)
  • 基于Python的非结构化数据检索系统的设计与实现(南京邮电大学·董海兰)
  • 基于.NET平台的游戏门户系统设计与实现(电子科技大学·余胜鹏)
  • 基于深度学习的智能问答系统的研究与实现(沈阳师范大学·卓越)
  • 基于领域的网络爬虫技术的研究与实现(武汉理工大学·谭龙远)
  • 基于.NET自定义控件的社区网站系统研究与实现(武汉理工大学·刘亚)
  • 基于网络爬虫的论坛数据分析系统的设计与实现(华中科技大学·黎曦)
  • 基于网络爬虫的论坛数据分析系统的设计与实现(华中科技大学·黎曦)
  • 基于结构数据的多模式智能问答消歧系统(山东大学·李华东)
  • 基于矩阵相乘的需求追踪方法及技术支持(广西师范大学·王超)
  • 基于MapGIS的地图服务系统的设计与实现(中国地质大学·汪鹏)
  • 基于B/S结构的新闻发布系统(吉林大学·郭蕊)
  • 基于结构数据的多模式智能问答消歧系统(山东大学·李华东)
  • 基于行列转换的统计功能研究与应用(中国海洋大学·张娜)
  • 基于深度学习的智能问答系统的研究与实现(沈阳师范大学·卓越)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕业设计驿站 ,原文地址:https://m.bishedaima.com/yuanma/36032.html

相关推荐

  • 基于SpringBoot框架的医疗挂号管理系统

    这是一套采用Java编程语言,基于SpringBoot框架构建的医疗预约管理系统源代码,项目中融入了Vue技术,开发工具为Idea或Eclipse,此系统适用于毕业设计或课程实践
    2024年05月23日
    2 1 1
  • 基于Python设计的信息检索系统

    基于Python设计的信息检索系统 【实验目的】: 开发一款针对英文文本的信息检索系统,可以实现建立索引表,布尔查询,通配符查询, 短语查询等功能
    2024年05月14日
    4 1 1
  • 基于Python的信息检索课程设计

    基于Python的信息检索课程设计 sdu视点新闻 全站爬虫爬取+索引构建+搜索引擎查询练习程序 爬虫功能使用Python的scrapy库实现
    2024年05月14日
    3 1 1
  • 学生评奖评优管理系统

    这是一个🔥🔥基于SpringBoot框架的学生评奖评优管理系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 基于Python实现书店销售管理系统

    书店销售管理管理子系统 一,设 计 总 说 明 现在社会随着计算机技术迅速发展与技术的逐渐成熟,信息技术已经使人们的生活发生深刻的变化,生活中的各种服务系统也使人们在生活中的联系日常销售活动方式发生了很大的变化
    2024年05月14日
    6 1 1
  • 网上摄影工作室

    这是一个🔥🔥基于SpringBoot框架的网上摄影工作室设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    2 1 1
  • java+swing实现推箱子小游戏课程设计源码

    在计算机科学领域,游戏设计一直是一个备受关注的话题,随着计算机技术的不断发展,人们对于游戏的需求也越来越高,《java+swing实现推箱子小游戏课程设计源码》是一个旨在使用Java语言和Swing框架实现的推箱子小游戏项目
    2024年05月07日
    5 1 1
  • 基于python + dlib实现人脸识别

    python 进行人脸识别 人脸识别的主要算法 其核心算法是 欧式距离算法使用该算法计算两张脸的面部特征差异,一般在 0,6 以下都可以被认为是同一张脸 人脸识别的主要步骤 获得人脸图片 将人脸图片转为 128D 的矩阵(这个也就是人脸特征的一种数字化表现) 保存人脸 128D 的特征到文件中 获取其他人脸转为 128D 特征通过欧式距离算法与我们保存的特征对比
    2024年05月14日
    2 1 1
  • 网上商城系统

    这是一个🔥🔥基于SpringBoot框架的网上商城系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 基于python实现的CS通信和P2P通信

    基于python实现的CS通信和P2P通信 一,实验要求 C/S通信实现要求 两台计算机分别模拟服务器,客户端 通过编程实现服务器端
    2024年05月14日
    1 1 1

发表回复

登录后才能评论