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),俗称剪枝算法。

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

转载于:https://www.cnblogs.com/ttss/p/4168909.html

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

  1. minimax算法及α-β剪枝算法

    minimax算法通常用于二人博弈游戏中,如井字棋,chomp游戏等.我对这个算法的理解是这样的:(以人和电脑下棋为例) 电脑要确定哪一步下棋使得优势最大,假设棋盘大小为nxm,不 考虑其他因素,那么 ...

  2. 象棋ai算法(极小-极大值搜索、负极大值函数、Alpha-Beta剪枝算法、渴望算法)

    ai的思考过程是怎样的?自然就是遍历所有的可能,找出相对最好的一种着法.我们首先要实现这个功能,之后再优化算法,使得效率更高. 本文介绍的算法: 极小-极大值搜索 负极大值函数 Alpha-Beta剪 ...

  3. c语言五子棋人工智能算法,五子棋人工智能算法实现研究,优化五子棋智能算法的思路...

    五子棋是一种两人对弈的纯策略型棋类游戏,是起源于中国古代的传统黑白棋种之一.现代五子棋日文称之为"连珠",英译为"Renju",英文称之为"Goban ...

  4. 决策树剪枝算法:REP/PEP/CCP算法

    一颗完全生长的决策树会面临一个严重的问题--过拟合,因此我们需要剪掉一些枝叶来提高决策树的泛化能力.即使不存在过拟合,如果样本数量和分类数量是一个海量的级别,也需要预剪枝,因为计算资源不足以支撑生成完 ...

  5. 决策树:CART决策树剪枝算法(超详细)

    文章目录 CART算法 1. CART生成算法 2. CART剪枝算法 CART剪枝算法流程 CART剪枝算法解析( 超详细 ) CART算法 CART假设决策树是二叉树,内部结点特征的取值为&quo ...

  6. C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  7. [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  8. js中常用的算法排序

    在工作中都会经常用到的一些基础算法,可以很快解决问题.这些都是在工作中总结的,希望可以帮助到大家. 一.数组乱序 arr.sort(function randomsort(a, b) {return ...

  9. 游戏开发中常用的数据结构和算法

    转载Loving_初衷 前言 时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长. ----------<塞尔塔传说> PS:为 ...

最新文章

  1. Redis源码分析:服务器端处理过程
  2. Windows UWP开发系列 – 3D变换
  3. Apache seaTunnel的本地启动
  4. 【RIA Services】系统分析
  5. 用C语言操作MySQL数据库
  6. C/C++ OpenCV图像的载入,显示,输出
  7. PDF文档解析,公司公告信息抽取(附数据集)
  8. oracle查询所有表名_oracle删错数据了,要跑路吗,等一下,先抢救一下
  9. VSCode 上竟然也能约会,谈对象了???
  10. 前端_day04_行,块,RGB,行高,overflow
  11. 参考文献空格怎么空_参考文献中的标点符号后要不要加空格
  12. 小米路由器3c 虚拟服务器,小米路由器怎么设置_小米路由器3c设置教程-WIFI之家...
  13. 腾讯地图计算两点间距离
  14. c++17好用的新特性总结
  15. 【Python技巧】字典
  16. 彼得•林奇基层调查选股法(GARP股票投资策略)
  17. LED背光源的结构分类
  18. 【实践】基于CentOS7部署Ceph集群(版本10.2.2)
  19. 【探路者】10月13日立会报告(团队第1周-第1次)
  20. 用Python编程语言来实现阿姆斯特朗数的检查

热门文章

  1. sts可以安装stylus插件吗_stylus 介绍 , 安装 , 使用
  2. python中用来回溯异常的模块_python学习笔记(异常)
  3. oracle中数据泵只导出索引,细致入微:如何使用数据泵导出表的部分列数据
  4. 【模板】第二类斯特林数Stirling
  5. 每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果
  6. 1005 继续(3n+1)猜想 (25 分)(c语言实现)
  7. TCP滑动窗口和拥塞控制机制
  8. Kafka配置offsets.retention.minutes和log.retention.minutes的区别
  9. HTML <dfn> 标签的简单介绍
  10. C++文件操作之get/getline(待学)