A*算法&博弈树α-β剪枝

A*算法/博弈树

  前阵子考试学了A*算法、博弈树和回溯,自己真是愚蠢至极,根本没就搞明白这些,所以对于这些算法问道的话就不能说清楚,也记不住,所以才有了这篇笔记。在这里感谢面试我的那位工程师~~

  A*算法

一些重要的概念

  启发式信息:用于帮助减少搜索量的与问题有关的信息或知识。

  启发式搜索:使用启发信息指导的搜索过程叫做启发式搜索。

  估价函数:定义在状态空间上的实值函数。

  open表:未扩展的节点

  close表:已扩展或正在扩展的节点

用f(n)表示节点n的估价函数:

1. f(n)表示从起点到目标,经由节点n最小费用路径上费用的估计。(最短路径 = 目前最短 + 剩下的估计最短路径)

(在搜索图中,接近解路径的节点有较低的函数值)

2. 以估价函数f的递增次序排列OPEN表中的节点:

估价函数低的排在前;具有相等函数值的节点以任意次序排序。

A算法与A*算法

  A算法: 使用估价函数f(n)=g(n)+h(n) 排列OPEN表中节点顺序的graphsearch算法。

g(n):对g*(n)的一个估计,是当前的搜索图G中s到n的最优路径费用 g(n)≥g*(n)

h(n):对h*(n)的估计,是从n到目标节点的估计代价,称为启发函数。

例如:当h(n) = 0, g(n) = d, 则f(n) = g(n)就变为了宽度优先搜索,也就是如果不需要启发,那就是宽度优先搜索的算法了。

  A*算法:一种静态路网中求解最短路最有效方法。与A算法不同,对任何节点n都有h(n)≤h*(n)的A算法。

例子

  八数码问题:利用估价函数f(n)=d(n)+W(n)正向搜索八数码难题,其中d(n)为深度,W(n)为目标的偏差数。

  解题步骤不做介绍,很简单,相信一会百度的。

感想

  A*算法与以往的图的搜索算法不同,是一种启发式的算法,通过设计一种恰当的估计函数,越是接近真实值,就越会掉地搜索的成本,降低算法的开销。这样的话,估计的函数的设计就尤为重要了。

博弈树

  博弈树是指由于动态博弈参与者的行动有先后次序,因此可以依次将参与者的行动展开成一个树状图形。

博弈

  对于任何一种博弈竞赛,我们可以构成一个博弈树。它类似于状态图和问题求解搜索中使用的搜索树。博弈树的结点对应于某一个棋局,其分支表示走一步棋;根部对应于开始位置,其叶表示对弈到此结束。在叶节点对应的棋局中,竞赛的结果可以是赢、输或者和局。

极大极小分析方法

  在二人博弈问题中,为了从众多可供选择的行动方案中选出一个对自己最为有利的行动方案,就需要对当前的情况以及将要发生的情况进行分析,通过某搜索算法从中选出最优的走步。

  基本思想或算法是:

  (1) 设博弈的双方中一方为MAX,另一方为MIN。然后为其中的一方寻找一个最优行动方案。
  (2) 为了找到当前的最优行动方案,需要对各个可能的方案所产生的后果进行比较,具体地说,就是要考虑每一方案实施后对方可能采取的所有行动,并计算可能的得分。
  (3) 为计算得分,需要根据问题的特性信息定义一个估价函数,用来估算当前博弈树端节点的得分。此时估算出来的得分称为静态估值。
  (4) 当端节点的估值计算出来后,再推算出父节点的得分,推算的方法是:对“或”节点,选其子节点中一个最大的得分作为父节点的得分,这是为了使自己在可供选择的方案中选一个对自己最有利的方案;对“与”节点,选其子节点中一个最小的得分作为父节点的得分,这是为了立足于最坏的情况。这样计算出的父节点的得分称为倒推值。
  (5) 如果一个行动方案能获得较大的倒推值,则它就是当前最好的行动方案。

  在博弈问题中,每一个格局可供选择的行动方案都有很多,因此会生成十分庞大的博弈树。试图利用完整的博弈树来进行极小极大分析是困难的。所以才有了α-β剪枝。

α-β剪枝

   为了提高搜索的效率,引入了通过对评估值的上下限进行估计,从而减少需进行评估节点的范围。

主要概念:

MAX节点的评估下限值α:

  作为MAX节点,假定它的MIN节点有N个,那么当它的第一个MIN节点的评估值为α时,则对于其它节点,如果有高于α的节点,就取那最高的节点值作为MAX节点的值;否则,该点的评估值为α。

MIN节点的评估上限值β:

  作为MIN节点,同样假定它的MAX节点有N个,那么当它的第一个MAX节点的评估值为β时,则对于其他节点,如果有低于β的节点,就取最低的节点值作为MIN节点的值;否则,该店的评估值为β。

主要思想:

  可以分为两个步骤,分别为α剪枝和β剪枝。

  如图:

 
 
 

A*算法&博弈树α-β剪枝的更多相关文章

  1. 每周一道数据结构(四)A*算法&博弈树α-β剪枝

    A*算法/博弈树 前阵子考试学了A*算法.博弈树和回溯,自己真是愚蠢至极,根本没就搞明白这些,所以对于这些算法问道的话就不能说清楚,也记不住,所以才有了这篇笔记.在这里感谢面试我的那位工程师~~ A* ...

  2. 决策树剪枝算法-悲观剪枝算法(PEP)

    前言 在机器学习经典算法中,决策树算法的重要性想必大家都是知道的.不管是ID3算法还是比如C4.5算法等等,都面临一个问题,就是通过直接生成的完全决策树对于训练样本来说是“过度拟合”的,说白了是太精确 ...

  3. CART算法与剪枝原理

    参考:https://blog.csdn.net/u014688145/article/details/53326910 知乎:https://www.zhihu.com/question/22697 ...

  4. 关联规则算法Apriori的学习与实现

    转自关联规则算法Apriori的学习与实现 首先我们来看,什么是规则?规则形如"如果-那么-(If-Then-)",前者为条件,后者为结果.关联规则挖掘用于寻找给定数据集中项之间的 ...

  5. 机器学习算法总结(二)——决策树(ID3, C4.5, CART)

    决策树是既可以作为分类算法,又可以作为回归算法,而且在经常被用作为集成算法中的基学习器.决策树是一种很古老的算法,也是很好理解的一种算法,构建决策树的过程本质上是一个递归的过程,采用if-then的规 ...

  6. Python3 决策树ID3算法实现

    # -*- coding: utf-8 -*- """ Created on Wed Jan 24 19:01:40 2018 @author: markli 采用信息增 ...

  7. Python3实现机器学习经典算法(四)C4.5决策树

    一.C4.5决策树概述 C4.5决策树是ID3决策树的改进算法,它解决了ID3决策树无法处理连续型数据的问题以及ID3决策树在使用信息增益划分数据集的时候倾向于选择属性分支更多的属性的问题.它的大部分 ...

  8. CART算法(转)

    来源:http://www.cnblogs.com/pinard/p/6053344.html 作者:刘建平Pinard 对于C4.5算法,我们也提到了它的不足,比如模型是用较为复杂的熵来度量,使用了 ...

  9. 决策树之CART算法

    顾名思义,CART算法(classification and regression tree)分类和回归算法,是一种应用广泛的决策树学习方法,既然是一种决策树学习方法,必然也满足决策树的几大步骤,即: ...

随机推荐

  1. Struts2的工作原理及工作流程

    众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能 快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需 ...

  2. 伺服驱动器UVW电机电源线相序错误

       我们有必要先了解此讨论的前提:编码器初始安装相位正确.伺服驱动器将全然"採信"电机编码器的初始安装相位所表征的电机电角度相位,无需在伺服电机 的UVW动力线接线连接后进行额外 ...

  3. 日积月累系列之国籍控件(js源码)

    一直苦于没有好的国籍控件可以用,于是抽空写了一个国籍控件,现分享给大家. 主要功能和界面介绍 国籍控件主要支持中文.英文过滤以及键盘上下事件. 源码介绍 国籍控件核心是两个文件,navtionalit ...

  4. VS2015预览

    VS2015预览版体验   .NET开源了,JAVA颤抖吧...据说VS2015可以开发android,ios,wp应用程序了,还可以开发能运行在mac,linux上的ASP.NET网站,如果真是这样 ...

  5. C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】

    重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...

  6. jquery防止事件冒泡和取消默认行为案例

    ----------------js取消事件冒泡: window.event.cancelBubble=true; --------------jquery事件参数可以防止事件冒泡: $(" ...

  7. mvc+EF比较好的框架

    个人看了传智播客的一位讲师搭建的框架感觉很好,就自己通过模仿划了一下很不讲究的类图来学习之间的关系(有些地方可能有自己理解不对的地方).很感激那位讲师,我会把这个框架用在我自己的项目中.

  8. Javascript多线程引擎(九)

    Javascript多线程引擎(九)--垃圾回收 垃圾回收这个话题对Programer来说是非常老旧的话题, 从手动的malloc/free 到半自动的 引用计数 再到全自动的 mark-sweep ...

  9. VS2012下systemC配置

    一.编译System库 1.下载SystemC library source code               到http://www.systemc.org注册会员账号后,即可下载SystemC ...

  10. HttpTest4Net

    HttpTest4Net HttpTest4Net是一款基于C#实现的和HTTP压力测试工具,通过工具可以简单地对HTTP服务进行一个压力测试.虽然VS.NET也集成了压力测试项目,但由于VS自身占用 ...