课程《认知计算及决策技术实验》中的作业
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-15
第36轮结束,步数为10,成功搜索,路径为0-4-8-4-8-4-8-9-13-14-15
第37轮结束,步数为6,成功搜索,路径为0-4-8-12-13-14-15
第38轮结束,步数为8,成功搜索,路径为0-4-8-4-8-9-13-14-15
第39轮结束,步数为8,成功搜索,路径为0-4-8-4-8-9-13-14-15
第40轮结束,步数为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的设置,同时在遇到高收益的同时提高贪心选择的概率。