今天我们来用Python实现一下Q-learning:
第一步:安装OpenAI的gym游戏环境包
游戏环境包相当于给AI提供各种游戏,以及相应的接口。就像你玩游,需要一个小霸王学习机,再配一个游戏卡。有了这个环境后,你就可以安心编写程序来玩就行了。Windows, Linux, 以及 MacOS系统都可以分别用pip (python2)和pip3 (python3)命令来安装:
pip install gym
pip3 install gym
我们今天要玩的迷宫游戏是一款迷宫游戏,这个在我的上一篇文章有详细介绍。
第二步:主程序设计
我们首先导入迷宫(Maze)游戏环境以及Q-learning的Q-table。这里的Q-table就是AI的游戏攻略,存储着每个状态采取不同行动的估计收益。学习的目标就是随着尝试游戏不断更新让这个攻略达到最大收益。
接着我们定义主函数,里面分别定义环境变量env,攻略RL ,然后是运行循环来更新攻略:
第一个循环是玩游戏的次数,比如这里我们设置成玩100次。在这一百次游戏种,每次都需要刷新游戏的观测,让红色方块从原点出发。然后就会进入第二层循环,这个循环是针对游戏种的每一次移动:先根据目前状态,从攻略中获得下一步行动(action),将这个行动传输到游戏环境中,游戏会反馈这个行动导致的新状态,奖励以及是否结束本次游戏。有了这些东西,攻略就可以学习经验,更新一次。
第三步:攻略
初始化:
我们用类来定义Q-learning算法中的攻略Q-table。在初始化中,我们设置好学习率,奖励衰退率,和一个贪心率。这里的奖励衰退率就是随着时间往后推,我们会把相应的奖励打折扣考虑,把重心放在眼前利益。而贪心率是我们在采取动作的时候,不总是按照当前攻略中的最大收益来,我们希望可以有10%的概率随机尝试,相当于采取冒险举动,这个好处是可以避免攻略陷入一个不好的循环当中出不来。
选择行动:
这里是攻略的行动部分,就是告诉你当前状态下如何采取行动。注意到我们有10%的贪心去选走乱走,而90%概率按照正常的最佳收益去走。
更新攻略:
这里第一步是检查状态,看下一步是否会导致游戏结束。如果是则更新只会加上当前奖励;如果不是,那么更新就会加上当前奖励以及下一步最大行动收益乘以收益衰减率。
检查状态:
参考:https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/