每周一道数据结构(四)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节点的值;否则,该店的评估值为β。

主要思想:

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

  如图:

 


本文 由 cococo点点 创作,采用 知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议进行许可。欢迎转载,请注明出处:
转载自:cococo点点 http://www.cnblogs.com/coder2012

时间: 2024-10-21 07:34:02

每周一道数据结构(四)A*算法&博弈树α-β剪枝的相关文章

每周一道数据结构(三)树、二叉树、最优二叉树

树 树形结构是一类非常重要的非线性结构,它可以很好地描述客观世界中广泛存在的具有分支关系或层次特性的对象,因此在计算机领域里有着广泛应用,如操作系统中的文件管理.编译程序中的语法结构和数据库系统信息组织形式等.   树的相关定义 节点的度:一个节点含有的子树的个数称为该节点的度: 树的度:一棵树中,最大的节点的度称为树的度: 叶节点或终端节点:度为零的节点: 非终端节点或分支节点:度不为零的节点: 双亲节点或父节点:若一个结点含有子节点,则这个节点称为其子节点的父节点: 孩子节点或子节点:一个节

每周一道数据结构(一)图

图的定义   图是由结点的有穷集合V和边的集合E组成.其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条 边,就表示这两个顶点具有相邻关系. 图分为两类,一个是有向图,即每条边都有方向,另一个是无向图,即每条边都没有方向.     相关问题 图的遍历问题 最小生成树问题 单源最短路径问题 拓扑排序问题 关键路径   图的遍历方法   和树的遍历类似,图的遍历也是从某个顶点出发,沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问.它是许多图的算

每周一道数据结构(二)排序总结

排序 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来. 排序是数据处理中经常使用的一种重要运算.在计算机及其应用系统中,花费在排序上的时间在系统运行时间中占有很大比重,并且排序本身对推动算法分析的发展也起很大作用.目前已有上百种排序方法,但并没有一个万能的排序方法来解决所有问题,接下来介绍几种常用的排序方法,并对它们进行分析和比较.   分类 1.按是否涉及数据的内.外存交换 内排序 在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内.外存交换,则称之为内

一道关于数组的算法题目,请用java实现。

问题描述 一道关于数组的算法题目,请用java实现. 在这个图片里我们有不同高度的墙.这个图片由一个整数数组所代表,数组中每个数是墙的高度.上边的图可以表示为数组[2,5,1,2,3,4,7,7,6]. 假如开始下雨了,那么墙之间的水坑能够装多少水呢? 请用java实现(任意数组求出结果) 解决方案 参考这三个贴 http://www.cnblogs.com/xiangnan/archive/2013/11/01/3402467.html http://blog.jobbole.com/5070

acm问题-Acm 一道数据结构的问题,求思路,不求代码。

问题描述 Acm 一道数据结构的问题,求思路,不求代码. 假设我有两数组,分别有n1 n2个数据(每组数据都不相同).我要两个数组中各取一个相加,有n1乘n2种结果,从小到大排,取前n个.(如果n1 n2 特别大怎么算),求大神教我. 解决方案 首先将n1 n2按照从小到大的顺序排成两列 最小的肯定是n1[0]+n2[0](下面简写,只用下标,比如n1[0]+n2[0]记作0,0) 稍微大一点的要么是1,0要么是0,1 如果是1,0,那么再大一点的,要么是1,1,要么是2,0 如果是0,1,那么

记一道毫无思路的算法题

今天贤内给了我一道很实际的算法题,把我彻底难住了,实在想不出来,于是写此博文以记之. 背景是这样的,现在有一个付款明细的Excel,里面有为哪个发票,哪个公司应付多少钱的明细,明细数据是62条,现在知道我们已经付出的金额为Sum,请问到底哪些发票是已付款的. 这是62条明细数据: 653165.00 356029.11 220896.45 146362.00 1847670.00 3018518.91 1347553.07 145010.74 339784.84 199350.28 120611

c语言数据结构,求算法

问题描述 c语言数据结构,求算法 把一个单链表LA中的奇数项和偶数项分开,分别放在两个单链表LB,LC中(要求利用原空间,头结点空间可另外开辟) 解决方案 (C语言-数据结构与算法)还原二叉树数据结构和算法系列 - c语言归并排序法 解决方案二: 对LA进行遍历,依次把LA中的项加入LB,LC中.依靠修改原LA中项的指针实现. 解决方案三: //输入时以-1结束#include <stdio.h>#include <stdlib.h>struct node{ int data; s

cc++ 数据结...-数据结构关于抢红包算法问题

问题描述 数据结构关于抢红包算法问题 老师叫用队列模仿写一个微信抢红包程序,但不知道具体思路和算法,有了解的求赐教,菜鸟在这跪谢了! 解决方案 不要想很复杂,其实老师的让你做的关键不是什么抢红包,而只是队列. 定义一个链表或者数组来表示队列,实现入队.出队操作.入队在这里就是提交红包请求,出队就是抢到红包,先到先得,数量达到为止. 解决方案二: 数据结构与算法问题 朋友圈

c语言-求做一道数据结构(C语言的题)

问题描述 求做一道数据结构(C语言的题) 运行文件加密程序,输入要加密的文件名,然后输入密码,最后输入加密后的文件名,程序对文件中读入的每一个字符与密码进行异或,再将异或后的内容倒序写入指定的文件中. 解密程序为加密程序的逆过程. 请使用顺序栈的结构设计并完成程序的功能. 解决方案 http://blog.163.com/chatter@126/blog/static/12766566120101020102247603/ 解决方案二: http://blog.csdn.net/fdipzone