Python做人工智能?让电脑自己学会玩游戏实战带你入门机械进修_电脑_石子
本日我们更进一步,编写程序让这个智障电脑可以自己与自己不断玩这个\"大众拿石子\"大众游戏,终极学会如何赢得这个游戏。不仅如此,我们还可以通过这个演习后的电脑玩家得知这个游戏的必胜窍门(文末处)。下面看看示意动图。
电脑自演习
与电脑对战
高能预警,本文与之前的文章不一样,须要自己实现一个强化学习中的一个小算法,但这个算法不难,而且可以广泛运用到其他同类型的博弈问题中,可以让你做出有趣的东西出来。我们开始吧。
[项目代码地址](https://github.com/CrystalWindSnake/Creative/tree/master/python/rl_learning_stone)
\公众拿石子\"大众游戏规则拿石子游戏规则很大略,开始有一定数量的石子(如果是10),然后两人轮流从石子堆中取走一定范围的数量(例如是1到3),以此类推,末了拿走剩余的所有石子的人就输了。
本文须要的库numpypandasretrying如果你已经看过我关于如何安装Anaconda的文章,那么这些库基本都不用操心了。
程序构造由于本次程序较为繁芜,并且日后我会连续利用不同的办法去改进他。因此不会利用上次文章中的代码构造,而是采取类的办法组织代码。 全体游戏有3个角色:
上述所有实现都在models.py中,有兴趣的朋友请去github查看即可。
关键点解释到底机器学习的程序与普通的运用开拓程序有什么不一样?正如本文的实现,程序的逻辑走向不是通过我们写代码的办法编写的,而是通过数据来决定。
下面就来大略解释全体过程的关键点
整体上来说,电脑玩家每次选择拿取多少个石子,是通过一个表的数据判断出来。图中的行索引(左边绿色框中的),表示当前盘面的石子数量。列索引(上方赤色框中),表示可以选择的数量那么行列索引交叉点的数据,就表示这次选择的代价,这个值越大,电脑玩家就会越可能选择。以是你可以看到,当你与电脑玩家对战时,实在他早就想好每一步要怎么走了。
问题是,这个表格中的代价数据是怎么得来的?没错,便是让他与自己不断的对战从而得到履历而来。 我们来剖析一下这个对战过程
一开始的时候,全体表格的值全是0假设当前剩余数量是10,那么他就会看行索引10对应的那一行的数据。他创造那一行全是0,那么他就会随机来挑。对的,此时他便是在尝尝看。当他选好本次拿取数后,就会根据下一轮可能涌现的状态来打算代价,然后更新到本次选择中。上图包含了3种可能的选择中的每个情形
当然,第一次演习时,比较靠后的记录都不会有任何更新。直到碰着褒奖或惩罚。下图表明了这样的情形
如果当前剩余数量是4,电脑玩家选择,他选了取走3个。这是裁判反馈给他说,你赢了,因此在(行4,列3)那里的代价加了10分。这便是电脑玩家可以自己学会玩游戏的关键。如果裁判反馈给他说,你输了,那么以一样的机制扣减代价分。
再来看看之后他是怎么得到下面行的分数。假设现在已经演习了几个回合,表格上方的行陆陆续续有些得分
假设当前剩余数量为6,电脑玩家随机选了1,那么就可以确定下一个可能的状态区域创造3行数据没有一行全是0或全是负数,因此(行6,列1)那里的代价分加3行区域中的最大值学习率(便是一个百分比)以此类推,电脑玩家不断与自己玩游戏,不断更新表格中的分数。把稳一点,全体项目我们都没有编写任何的游戏逻辑代码。只有关于褒奖与惩罚干系的逻辑。游戏必胜窍门
上图把电脑玩家学习到的表格数据显示出来看到那些整行都是负数的吗,那些便是必定会输的状态。这也是为什么我设定于电脑对战时默认是21开始并且是电脑先拿,这样我才有机会赢。我们还看到从2开始,每个3段就会涌现一个必输的盘面。小结本文利用了最大略的强化学习中的Q-Table机制,让电脑自学玩游戏,这是一个非常适宜入门的例子(他须要你在Q-Table方法上做出变通)。
后续我会改进这个游戏,用不同的机器学习的办法去实现这些功能,敬请期待。
如果以为本文对你有所帮助,记得关注、评论、转发、收藏噢~
本文系作者个人观点,不代表本站立场,转载请注明出处!