点击上方“程序人生”,选择“置顶公众号”
第一时间关注程序猿(媛)身边的故事
前言:自AlphaGo战胜世界著名九段围棋手李世石之后,我就对棋类人工智能产生了极大的兴趣,并想要自己实现象棋的人工智能。然而那个时候我还在读高二,没有这么深厚的代码基础,所以那个时候也就只能想想了。但是现在不一样了,通过学习编程,已经可以让我在棋类人工智能这个领域向前探索了。
推荐下小编的C++学习群;513801371,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2019最新的C++和0基础入门教程,欢迎初学和进阶中的小伙伴。
每天晚上20:00都会开直播给大家分享C++知识和路线方法,群里会不定期更新最新的教程和学习方法(进群送2019C++学习教程),大家都是学习C++的,或是转行,或是大学生,还有工作中想提升自己能力的C++党,如果你是正在学习C++的小伙伴可以加入学习。最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实,非常适合新手学习,有不懂的问题可以随时问我,工作不忙的时候希望可以给大家解惑
首先说明一下本系列博客描述的人工智能算法不是基于机器学习、深度学习这么高深的知识,而是一种穷举找最优走法的算法。之所以AlphaGo不能使用这种算法战胜李世石,是因为围棋棋局局势的判断是极为复杂的,想要穷举所有的情况,全世界所有的计算机一起运行一百万年也无法找到最优走法。所以DeepMind团队的大佬就想出了另一种解决方案就是让AlphaGo自己学习高水平棋手间的对局,从而提升AlphaGo的棋力。然而象棋的棋局判断还是比较容易的,杀掉对面的老将就可以获胜,杀掉对面的车马炮等棋子就可以提高自己的胜率/降低对方的胜率。具体的算法在之后的篇章详细讲解。
实现本系列博客中算法的编程工具是Qt5.5.1。
既然实现象棋人工智能的算法的本质是穷举,那么就要找到所有的通路,所谓的通路就是能够走棋的那些“路”们,走不通的那些“路”就要直接被pass掉。
1.先把棋盘抽象出来,象棋棋盘有10行9列,行标设为0~9,列标设为0~8。以左上角的坐标为(0,0),假设初始时上方为红棋,下方为黑棋。则初始时所有棋子的坐标为:
车1(红方):(0,0);车2(红方):(0,8);
马1(红方):(0,1);马2(红方):(0,7);
相1(红方):(0,2);相2(红方):(0,6);
士1(红方):(0,3);士2(红方):(0,5);
将(红方):(0