最近机器学习很火, 乘着这把火,我也学习了一把,但是没有直接学习深度学习,而是遵从一位老前辈,一定要把人工智能的所有方法都了解掌握了,才能真正的掌握人工智能。。。 我只能说, 路漫漫。。
对于博弈类人工智能,其中一个方法就是:**博弈树极大极小值alpha-beta剪枝搜索。**
是不是觉得这个名字很牛逼, 但经过我的详细解读, 你马上就会发现,原来不过如此。
对于要实现一个会智能下五子棋的AI,要怎么去实现呢?自然想到的方法就是,让计算机把每一步的可能性都试一遍,看走在那效果最好。 其实就是搜索的方法,搜索所有的下一步可能性,择优选择。这就是博弈树搜索。
## 博弈树搜索
什么是博弈树搜素呢?博弈就是相互采取最优策略斗争的意思。比如说下五子棋,你下一步,我下一步,这就是相互博弈。假设棋盘的大小是10*10,那就是100个点可以下, 那么第一步可选择的可能就是100, 假设是下在了A点, 那么第二步就有除了A点的剩下的99个点的可能。 假设下在了B点, 那么第二步就有除了B点的剩下的99个点的可能,假设下在了C点...
看到没有, 我上面的假设可以复制100次, 同时基于其中的一个点,第二步又可以复制99次, 以此类推,就构成了一个树状的结构:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/6893492-41d07028d54b486a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
好了, 问题来了, 这么多可能性, 走哪一步才是最优的呢? 这就是下一步,极大极小值搜索。
## 极大极小值搜索
对于一个棋局, 判断它对我来说是占优势还是劣势, 能不能用个比较确定的数值来评估呢?答案是可以的。 对于五子棋就是统计目前的棋型,并累加分数。 比如如果有4个子连起来了, 那就给个很高的评分,因为下一步就可以赢了, 如果是3个子连起来了,给个相对较低的评分,因为不一定就能赢,对方会堵你呢, 但是比只有2 个子连在一起的得分要高吧, 如是就有了下面的棋型评分表:
```
# 棋型的评估分数
shape_score = [(50, (0, 1, 1, 0, 0)),
(50, (0, 0, 1, 1, 0)),
(200, (1, 1, 0, 1, 0)),
(500, (0, 0, 1, 1, 1)),
(500, (1, 1, 1, 0, 0)),
(5000, (0, 1, 1, 1, 0)),
(5000, (0, 1, 0, 1, 1, 0)),
(5000, (0, 1, 1, 0, 1, 0)),
(5000, (1, 1, 1, 0, 1)),
(5000, (1, 1, 0, 1, 1)),
(5000, (1, 0, 1, 1, 1)),
(5000, (1, 1, 1, 1, 0)),
(5000, (0, 1, 1, 1, 1)),
(50000, (0, 1, 1, 1, 1, 0)),
(99999999, (1, 1, 1, 1, 1))]
```
这篇文章的示例是用python代码实现, 上面是我列出的一些常见的五子棋形状,1代表有子落在此处,0代表是空位,下一步可以下在此处。 前面是对应的分值。
那么对应评估局面上的分数, 就是统计所有匹配的棋型得分并累加。这个分数的统计就叫做评估函数,而这个评估函数的好坏是非常重要的, 下面的算法都是固定的,任何博弈类游戏都适合, 但评估函数就千差万别了。
```
# 评估函数
def evaluation(is_ai):
total_score = 0
if is_ai:
my_list = list1
enemy_list = list2
else:
my_list = list2
enemy_list = list1
# 算自己的得分
score_all_arr = [] # 得分形状的位置 用于计算如果有相交 得分翻倍
my_score = 0
for pt in my_list:
m = pt[0]
n = pt[1]
my_score += cal_score(m, n, 0, 1, enemy_list, my_list, score_all_arr)
my_score += cal_score(m, n, 1, 0, enemy_list, my_list, score_all_arr)
my_score += cal_score(m, n, 1, 1, enemy_list, my_list, score_all_arr)
my_score += cal_score(m, n, -1, 1, enemy_list, my_list, score_all_arr)
# 算敌人的得分, 并减去
score_all_arr_enemy = []
enemy_score = 0
for pt in enemy_list:
m = pt[0]
n = pt[1]
enemy_score += cal_score(m, n, 0, 1, my_list, enemy_list, score_all_arr_enemy)
enemy_score += cal_score(m, n, 1, 0, my_list, enemy_list, score_all_arr_enemy)
enemy_score += cal_score(m, n, 1, 1, my_list, enemy_list, score_all_arr_enemy)
enemy_score += cal_score(m, n, -1, 1, my_list, enemy_list, score_all_arr_enemy)
total_score = my_score - enemy_score*ratio*0.1
return total_score
```
对于AI要走在那里最好,那就是计算它在走在某一个点后, 计算局面的得分,然后取得分最大的那个点,不就是最应该下的点吗? so easy! 这就是极大值搜索。
但不要忘了, 你这是只考虑了一步啊, 搜索的深度只有1, 没听说老谋深算的家伙都是考虑3步的吗, 也就是要考虑下了这一步后,对手下一步会怎么下。对手不傻,肯定会在我得分最小的那个点上下, 这个得分是相对于我而言的,我的得分最小, 那就是对手的最优策略了, 这就是极小值搜索。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/6893492-43f994077bb9a6d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
AI要考虑3步的话, 那就是搜索深度为3,那就是搜索落在那个点,3步后得分最大。这就可以和看能看3步棋的老家伙对抗了。
关于极大极小值的伪代码(注意是伪代码,不是本文的示例的python代码):
这里面有递归,相信能很好理解吧。
```
int MinMax(int depth) { // 函数的评估都是以白方的角度来评估的
if (SideToMove() == WHITE) { // 白方是“最大”者
return Max(depth);
} else { // 黑方是“最小”者
return Min(depth);
}
}
int Max(int depth) {
int best = -INFINITY;
if (depth <= 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = Min(depth - 1);
UnmakeMove();
if (val > best) {
best = val;
}
}
return best;
}
int Min(int depth) {
int best = INFINITY; // 注意这里不同于“最大”算法
if (depth <= 0) {
return Evaluate();
}
GenerateLegalMoves();
while (MovesLeft()) {
MakeNextMove();
val = Max(depth - 1);
UnmakeMove();
if (val < best) { // 注意这里不同于“最大”算法
best = val;
}
}
return best;
}
```
到这里, 感觉不就完了吗?可以和老家伙一决高下了? 这就错了, 忽略了一个很重要的问题, 就是搜索的计算量, 你以为计算机是机器,cpu是 intel i7就瞬间完成计算啊, 这个博弈树,之所以叫树,那么他的枝点的数量,是以指数增长的,搜索深度3和搜索深度5那计算量差的可不是几倍的概念。而是差指数倍的概念。 所以虽然五子棋棋盘没围棋大, 但是按照这种全部可能性都搜索的方法去搜索,是要死电脑的。
于是,聪明的人对其进行了优化, 这就是alpha-beta剪枝搜索。
## alpha-beta剪枝搜索
假设博弈树的搜索情况如下图:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/6893492-56a256a2c482c24e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
α为已知的最大值, β为已知的最小值, 因为还没搜索不知道是多少,保险起见,初始化为-∞ 和+∞。
搜索到D的时候,局面得分是5,(顺便说一句,这样的搜索是深度优先搜索,什么是深度优先搜索,可百度)那么也就是说要搜索最大值,那么只可能会在(5,+∞) 之间, �
hakesashou
- 粉丝: 7211
- 资源: 1722
最新资源
- MATLAB代码:多种调度模式下的光储电站经济性最优储能容量配置分析 关键词:光储电站 优化配置 经济性分析 参考文档:《多种调度模式下的光储电站经济性最优储能容量配置分析》仅参考 仿真平台:MATL
- 基于自抗扰(ADRC)的永磁同步电机矢量控制
- 锂电池项目三菱Q06UDV,威纶通触摸屏程序 LG化学全自动锂电池化成分容一体机 (2套PLC程序+1套普洛菲斯触摸屏程序) 三菱PLC程序大型锂电项目: 项目说明如下: 1.plc程序,触摸屏程序
- FPGA图像处理, 每个算法都包括matlab算法、modelsim仿真、小梅哥AC620上板工程、正点原子新起点 开拓者上板工程
- MATLAB环境下一种基于小波散射网络的纹理图像分类方法与基于小波散射变和深度学习的寄生虫感染图像分类方法 算法运行环境为MATLAB R2021b 1.主要讲解如何利用小波散射网络对二维纹理图像进行
- 移相全桥电路,psfb,dcdc
- 基于博途1200PLC和组态王的起重机仿真控制系统
- 基于博途1200 plc的邮件分拣控制系统 软件版本:V15
- mmc模块化多电平流器仿真,7电平闭环控制,外环控直流电压,有功,无功均有,已单独加了电容电压平衡和二倍频环流抑制,采用载波移相调制 可供学习参考
- 记录算法工程师实习招聘面试准备过程中所掌握的知识.zip
- 对于学习者来说,最好的习惯之一应该是进行有规律的自测,重新校准自己知道什么、不知道什么。每日面试小测
- MATLAB代码:基于数据驱动的模型预测控制电力系统机组组合优化 关键词:数据驱动 模型预测控制 闭环 机组组合问题 优化调度 参考文档:Feature-driven-Economic-Impro
- 模糊PID控制器的C语言实现.zip
- 六轴机械臂DH正向建模及调用GPU梯度下降法求解逆向解_Gradient-De
- 利用stm32进行机械臂的制作与控制。_robotic-control.zip
- 有关于机械手臂移动_Move_hand.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈