之前本号就有一篇文章是关于用Python编写一个"拿石子"游戏,一个能让你与电脑对弈的小游戏,但其中电脑玩家的选择是随机的,意味着你是与一个智障电脑在玩游戏。
今天我们更进一步,编写程序让这个智障电脑可以自己与自己不断玩这个"拿石子"游戏,最终学会如何赢得这个游戏。不仅如此,我们还可以通过这个训练后的电脑玩家得知这个游戏的必胜秘诀(文末处)。
下面看看示意图。
自训练
对战
高能预警,本文与之前的文章不一样,需要自己实现一个强化学习中的一个小算法,但这个算法不难,而且可以广泛应用到其他同类型的博弈问题中,可以让你做出有趣的东西出来。我们开始吧。
拿石子游戏规则很简单,开始有一定数量的石子(假如是10),然后两人轮流从石子堆中取走一定范围的数量(例如是1到3),以此类推,最后拿走剩余的所有石子的人就输了。
如果你已经看过我关于如何安装Anaconda的文章,那么这些库基本都不用安装了。
由于本次程序较为复杂,并且日后我会继续使用不同的方式去改善他。因此本次不会使用上次文章中的代码结构,而是采用类的方式组织代码。 整个游戏有3个角色:
上述所有实现都在models.py中,有兴趣的朋友请去github查看即可。
到底机器学习的程序与普通的应用开发程序有什么不一样?正如本文的实现,程序的逻辑走向不是通过我们写代码的方式编写的,而是通过数据来决定。
下面就来简单说明整个过程的关键点
问题是,这个表格中的价值数据是怎么得来的?没错,就是让他与自己不断的对战从而获得经验而来。 我们来分析一下这个对战过程
当然,第一次训练时,比较靠后的记录都不会有任何更新。直到遇到奖励或惩罚。下图表明了这样的情况
再来看看之后他是怎么得到下面行的分数。假设现在已经训练了几个回合,表格上方的行陆陆续续有些得分
本文利用了最简单的强化学习中的Q-Table机制,让电脑自学玩游戏,这是一个非常适合入门的例子(他需要你在Q-Table方法上做出变通)。以后我会继续改善这个游戏,用不同的机器学习的方式去实现这些功能,敬请期待。
如果觉得本文对你有所帮助,记得关注、评论、转发、收藏噢~
[项目代码地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)