【强化学习】基于Qlearning的最短路径吃糖果(附源码)

课程《认知计算及决策技术实验》中的作业

1 介绍

Agent需要在方格地图中,找出一条路径吃掉所有糖果

  • Agent能上下左右移动,但不可出界
  • 需要吃掉所有的糖果,且移动步数最少,路径最短

2 实现原理

基于Q学习实现算法,其行动准则为好的行为可以获得奖励,不好的行为会受到惩罚。

我们需要初始化一个Q(s,a)表,Q表有s行a列,对应s(state)种不同状态和a种不同的动作(action)。Q表中是每一个状态(s1,s2,…)所对应的是所有动作(a1,a2,…)的Q值。Q表可以帮助我们在某一个状态时,根据Q表中的值选择出一个最佳的动作,让我们能获得最大的收益。

在这里插入图片描述
Qlearning算法流程如下
在这里插入图片描述
在其中:

  • ɑ:学习率:影响学习速率,体现在Q表更新迭代大小的速率;
  • r:为奖赏Reward,当人物在当前状态所选择下一部的执行动作时能得到的奖赏;
  • γ:叫做衰减因子,表达的是未来值对现在影响的大小;
  • ϵ−greedy:是用在决策上的一个策略,比如ϵ= 0.9的时候,就说明百分之90的情况我会按照Q表的最优值选择行为,百分之10的时间随机选择行为。

针对我们具体的问题,进行如下设置,为了便于进行Q表的更新,同时满足游戏要求:

  • 为了吃掉所有糖果,吃掉一个糖果加10分,重复同一位置糖果不加分;
  • 为了寻求路径最短,每走一步需要减1分;
  • 撞墙则减-100分,且本次搜索结束,进行下一轮搜索。

Q表的构造
对于Q表中的状态,由地图结果,构造0,1,2…14,15共16种状态,对应地图的16个位置,每个位置有上、下、左、右四种动作(action)可以选择。由此构造一个16*4的Q表。
通过以上规则,Agent会通过Q表查询出每一步的最佳选择,同时也会根据当前步获得奖赏的情况更新Q表,迭代多次,从而找到一条最佳路径。

3 实验环境

系统:Windows10、MacOS
软件:PyCharm、Qt Designer
编程语言:Python3.6.8
所需包:numpy、pandas、PyQt5、PyQt5-tools

关于PyQt5的安装与使用可参考博客:PyQt5的安装与Designer的配置使用(实现一个入门Demo,图文详解)

4 运行结果

1轮结束,步数为10,撞墙,路径为0-4-5-1-5-9-10-6-7-3-over
第2轮结束,步数为1,撞墙,路径为0-over
第3轮结束,步数为1,撞墙,路径为0-over
第4轮结束,步数为2,撞墙,路径为0-4-over
第5轮结束,步数为7,撞墙,路径为0-1-0-1-0-4-8-over
第6轮结束,步数为3,撞墙,路径为0-1-2-over
………
第35轮结束,步数为6,成功搜索,路径为0-4-8-12-13-14-1536轮结束,步数为10,成功搜索,路径为0-4-8-4-8-4-8-9-13-14-1537轮结束,步数为6,成功搜索,路径为0-4-8-12-13-14-1538轮结束,步数为8,成功搜索,路径为0-4-8-4-8-9-13-14-1539轮结束,步数为8,成功搜索,路径为0-4-8-4-8-9-13-14-1540轮结束,步数为6,成功搜索,路径为0-4-8-12-13-14-15
经过40次迭代搜索,本次搜索成功,最小步数为6,最短路径为0-4-8-12-13-14-15

可以看到,最开始时,Agent还未学习到周围环境的信息,会经常“撞墙”而失败搜索,在经历多轮游戏局数的学习之后,Agent以熟悉周围环境,不再“撞墙”,而且搜索步数也会通过学习而不断缩减。

5 简单的改进

Agent在每次做出下一个动作的选择都会根据Q表中的信息选择一个对未来收益最大的动作,但同时根据设置的参数ϵ−greedy也有一定概率随机选择下一个执行的动作。
我们将ϵ−greedy的值设置为动态的,当根据Q表中的信息选择下一个动作时,Q表中的值有正数(高收益),则增大ϵ−greedy,否则不变,同时ϵ−greedy值仅受当前选择的影响,不会传递给下一次选择。

这样既能保持原本对ϵ−greedy的设置,同时在遇到高收益的同时提高贪心选择的概率。

6 代码下载

GitHub

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
强化学习中,求解两点间最短路径可以使用一种算法称为Q-learning。Q-learning是一种基于值函数的强化学习算法,用于在一个有向图中找到两点之间的最短路径。 首先,需要定义状态空间和动作空间。在这个问题中,状态空间可以表示为图中的节点,动作空间可以表示为从一个节点到另一个节点的边。 然后,需要初始化一个Q表,用于存储每个状态和动作的值。Q表的大小与状态空间和动作空间的大小相对应。 接下来,通过迭代更新Q值来学习最短路径。在每次迭代中,从起始节点开始,根据当前状态选择一个动作,并根据选择的动作更新Q值。更新Q值的公式如下: Q(s, a) = Q(s, a) + α * (R + γ * max(Q(s', a')) - Q(s, a)) 其中: - Q(s, a)是状态s和动作a的Q值。 - α是学习率,控制每次更新的幅度。 - R是在状态s执行动作a后获得的即时奖励。 - γ是折扣因子,用于衡量未来奖励的重要性。 - max(Q(s', a'))表示在下一个状态s'中选择最大Q值的动作a'。 重复执行这个过程直到收敛或达到预定的迭代次数。 最后,可以使用学习到的Q表来找到两点之间的最短路径。从起始节点开始,选择具有最大Q值的动作,然后移动到下一个状态。重复这个过程直到到达目标节点。 这就是使用强化学习中的Q-learning算法来求解两点间最短路径的基本步骤。当然,这只是一个简单的示例,实际应用中可能需要考虑更多的因素和优化策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值