象棋中常用的最小值最大值算法及剪枝算法

1.象棋中通常需要推算当前局面下,每走一步之后的局面分,通常我们可以设定考虑几步棋,通常我们所说的算棋,而计算机的AI算法中最常用的就是最大值最小值算法,而剪枝算法是对最大值最小值算法的一种优化。

如上图所示:

1.如果在当前局面下,假设有三步可走的棋,走完之后得到的局面分分别为100,80,90,如果仅考虑一步的情况下,当然是选100所对应的棋走,这是最简单也是最短视的走法,这样的AI会让人认为太笨了。此时level=1

2.如果考虑两步棋的情况,走完第一步之后,轮到对方走了,对方走完之后,此时的局面分是第三层的分,可能的走法有:走100分支的话,有三种可能:60,10,40,走80分支的话,有:50,30,20,走90分支的话,有:40,50,30,假设我们都不傻,都会挑使对方最不利的棋走,因此走100分支的话,对方可定会走10分支,如果走80分支的话,对方肯定走20分支,如果走90分支的话,对方肯定走30分支,因此我们为了使走两步之后(仅考虑2步,level=2),自己获得的局面分最大,使自己最有利,则必须走90分支,这样的话,对方无论怎么走,得到的最小值局面分都是30,都比走其他分支(100和80)的最小值要大。这就是最小值最大值算法。

3.如果考虑三步棋的情况,此时level=3,到第四层局面的时候,此时level=0,即只需要直接计算当前每个分支的局面分即可,得到:15,35,8,9,25,15,34,25,8,20,18,10,7,14,32,21,16,15,

此时我们如何走才最有利呢?

a.假设第一步走100分支,则对方肯定走10分支,此时我们只能走9分支(getMaxScore),

b.如果第一步走80分支,则对方肯定走20分支,此时我们只能走18分支(getMaxScore,获取最佳局面分)

c.如果第一步走90分支,则对方肯定走30分支,此时我们只能走16分支(getMaxScore,获取最佳局面分)

因此,我们只需要考虑在第四层中选取一个最大值即可。毫无疑问第一步肯定走80分支,然后对方走20分支,然后我们走18分支,此时的局面对我们最有利。

因此总结如下:

我们最终的目的是使最后得到的局面分最大为依据的。

最小值,最大值算法交替使用,根据不同的考虑步数(level)有不同的走法。

getMinScore()会调用getMaxScore(),getMaxScore()内部也会调用getMinScore()两个函数构成间接递归。

4.剪枝算法:

假设考虑这么一种情况:

假设第二分支80下面的50换成5,且只考虑level=2的情况,此时我们第一步是求最小值(第三层的),第二步求最大值(第二层的),注意这是回朔算法,根据可能得到的结果(最终局面分)往回推,可能要走的棋步。

当我们推演完第一分支(100)之后发现最小值为10,而当我们推演第二分支的时候,在求最小值时(第三层),遇到了5,显然5<10,并且此时的上一层(第二层,即100,80,90)要求的是最大值,因此该分支的其他分支(30,20)就不需要推演了,因为该分支的最小值(5)已经比上一分支(100-->60,10,40)中的最小值10要小,再推演下去已经没有意义了,因此可以把剩下的该分支的其他分支,舍弃掉,不需要计算了,大大降低了计算量,直接推演第三分之(90),俗称剪枝算法。

因此我们需要传入一个参数,标记上一分支中的最值。如果该分支中的某一个值比上一分支中的最值还要小,该分支的其他分支,就可以忽略了,因为该分支肯定不在考虑范围之内了。因此可以提前结束本分支的计算,而直接计算下一分支。

时间: 2024-10-06 16:40:59

象棋中常用的最小值最大值算法及剪枝算法的相关文章

脑洞大开--一条项目中常用的linux命令引发的经典算法题

小时候家里定了<读者>的月刊,里面记录一个故事:说有有个偏僻的乡村一日突然来了一个美女,她携着万贯家财子女在当地安家落户,成了当地的乡绅.她让她的子女世世代代的保守这个秘密,直到这个秘密不会再对家族带来灾难.她就是陈圆圆.当年吴三桂领清兵入关,冲冠一怒为红颜,改写了中国的历史,自己却能全身而退的那个人. 周五例行公事的查看一下离线数据推送项目的数据和log.将log用awk分段之后,我想知道实时数据前10个被重复发送的数据ID都被重复发送了几次,从而找到进一步优化的入手点,天知道我对这个项目已

机器学习---算法---K-近邻算法

转自:https://www.cnblogs.com/Rosanna/p/3615507.html K-近邻和最近邻(K=1)是模式识别中常用的分类方法,K-近邻算法思想是找到与当前样本相邻的K个有标签样本,然后通过投票决定此样本的类别.例如下图中如何分类未知的绿色圆圈呢? 例如我们可以取K=3个临近的样本时,通过投票(红色两个大于蓝色一个),从而将绿色圆圈归于红色三角一类. 一.基于实例的学习 K-近邻和局部加权回归就是基于实例的学习.基于实例的学习过程只是简单的存储已知的训练数据,当遇到新的

均值滤波,中值滤波,最大值滤波,最小值滤波

均值滤波: 均值滤波是图像处理中常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高频信号将被去掉,因此可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能.理想的均值滤波是用每个像素和它周围像素计算出来的均值替换图像中每个像素.采样Kernel数据通常是3x3的矩阵,如下所示: 从左到右,从上到下计算图像中的每个像素,最终得到处理后的图像.均值滤波可以加上两个参数,即迭代次数,kernel数据大小. 一个相同大小的kernel,经过多次迭代效果会越来越好. 同样:迭代次数相同,均值滤波的效果

推荐系统中常用算法 以及优点缺点对比

推荐系统中常用算法 以及优点缺点对比 在 推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程度上决定了推荐系统性能的优劣.目前,主要的推荐方法包括:基于内容推荐.协同过滤推荐.基于关联规则推荐.基于效用推荐.基于知识推荐和组合推荐. 一.基于内容推荐 基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器

用C随机产生的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值。

用 C 求一组随机数的第二大值,不能通过对整体排序求得 1 随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值.最小值.平均值以及各元素之和,及第二大值.        int a[20];    int sum = 0; //存储数组元素的和    //为数组赋值    printf("数组中的元素为:\n ");    for (int i = 0; i < 20; i ++) {        a[i] = arc4random() % 41 +

随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值。

int a[20] = {0};//定义一个长度为20的数组a int max = 0;//用来存储数组a中所有元素的最大值 int min = 0;//用来存储数组a中所有元素的最小值 int sum = 0;//用来存储数组a各元素的和 float aver = 0.0;//用来存储数组a中所有元素的平均值 int secondMax = 0;//用来存储数组a的第二大值,第二大值 为 不同于最大值的剩余元素的最大值 for (int i = 0; i < 20; i++) {//用来循环获

Java中常用的查找算法——顺序查找和二分查找

Java中常用的查找算法——顺序查找和二分查找 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static void main(String[] arg

C++11标准中常用到的各种算法汇总.

在C++11标准中定义了很多算法,这些算法可以让我们很方便的操作各种容器和数组,这里要注意一下,这些算法操作的并非容器,而是迭代器,然后通过迭代器来操作容器中的数据,算法本身并不会关注容器中保存的数据的类型. 以下是我对常识的算法的总结,这些算法大部分都在algorithm.h中,还有一些在numeric.h中. 这里我们的容器都用这几个: vector<string> vec; vector<int> vec1; vec<string> vec2; 1.find();

Spark中常用的算法

Spark中常用的算法: 3.2.1 分类算法 分类算法属于监督式学习,使用类标签已知的样本建立一个分类函数或分类模型,应用分类模型,能把数据库中的类标签未知的数据进行归类.分类在数据挖掘中是一项重要的任务,目前在商业上应用最多,常见的典型应用场景有流失预测.精确营销.客户获取.个性偏好等.MLlib 目前支持分类算法有:逻辑回归.支持向量机.朴素贝叶斯和决策树. 案例:导入训练数据集,然后在训练集上执行训练算法,最后在所得模型上进行预测并计算训练误差. import org.apache.sp