基本搜索技术
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章基本搜索技术
假定你的房间里铺有100 块地板,其中一块底下有一块金砖,而另一块底下有一颗地雷。如果你翻开有金砖的那块地板,你就可以成为百万富翁;如果你翻开有地雷的那块地板,你就可以到地狱旅行。在经历了长期煎熬之后,你决定将这些地板逐一翻开,以找寻百万富翁的生活。这个寻找命运答案的过程,就是搜索(Search)。
而将地板逐一翻开的搜索方法,叫作盲目搜索(Blind Search)。在这个盲目搜索的过程中,随着未翻开地板数目的减少,终将会找到一个答案。
又假定你还有一位朝夕相伴的室友,同你一样起了这个念头。于是,你们商定每人每天可以交替翻开一块地板。这样当一个人碰到地雷时,他最亲密的朋友就可以得到剩下的金砖。所以你们各自在心中祝愿对方黄泉路上一帆风顺。最多50 天,命运的答案就会完全揭晓。你们翻开了98 块地板后仍一无所获,在最后的时刻,你犹豫了,到底要不要翻开这一块决定命运的地板?你感到同你竞争的并非你的室友,而是魔鬼的化身。这个同魔鬼的化身交战的过程就叫作博弈。而敌对双方交替动作的搜索叫作对抗性搜索(AdversarialSearch)。
4.1博弈树
设想下象棋的情形,两人对弈,我们将其中一位叫做甲,另一位叫做乙。假定现在该甲走棋,甲可以有40 种走法(不论好坏);而对甲的任一走法,乙也可以有与之相对的若干种走法。然后又轮到甲走棋,对乙的走法甲又有若干种方法应对……如此往复。
显然,我们可以依此构建一棵博弈树,将所有的走法罗列出来。在这棵树的根部是棋局的初始局面。根的若干子节点则是由甲的每一种可能走法所生成的局面,而这些节点的子节点则是由与之相对的乙的每一种可能走法所生成的局面……在这棵树的末梢,是结束的棋局,甲胜或者乙胜或者是双方都无法取胜的平局。
图 4.1 极为简化地示意了博弈树的概要。图中省略号的地方指未能列出的大量分枝。
如果我们令甲胜的局面值为W IN,乙胜的局面值为LOST,而和局的值为DRAW 。当轮到甲走时,甲定会选择子节点值为W IN 或DRAW(如果没有值为W IN 的子节点的话)的走法;而轮到乙时,乙则会选择子节点值为LOST 或DRAW(如果没有值为LOST 的子节点的话)的走法。对于中间节点的值可以有如下计算方法:如果该节点所对应的局面轮到甲走棋,则该节点的值是其所有子节点中值最佳(对甲而言)的一个的值;如果该节点所对应的局面轮到乙走棋,则该节点的值是其所有子节点中值最差(对甲而言)的一个的值。这样看来从这棵树的叶子节点倒推向根部,就可以得出所有节点的值。双方就可以从其所面临的棋局中选择一步好棋。然后一步步走向胜利。
博弈树是从根部向下递归产生的一棵包含所有可能的对弈过程的搜索树,这里称为完全搜索树。
NeillGraham 形容此过程类似于在一个状态图中寻求从初始状态通向终了状态的过程①。只是状态图搜索仅有一个主体参加,仅是单方面做出的路径选择。而博弈树的搜索则有对立的双方参加,一方只能做出一半选择,而这一半选择的目的是使对方远离其竭力靠近的目标。也就是说状态图搜索是纯粹的或树(OR tree),而博弈树搜索是与或树(AND /OR tree)。
①参考文献[2]。
图 4.1 象棋博弈树示意
让我们面对一下不幸的实际。那就是,除了极少数非常简单的棋类游戏,大多数棋类游戏,如象棋,我们都没有建立完全搜索树的可能。一方面是因为很多情形根本就到达不了叶子节点,如将一个棋子反复来回走动就可永远循环下去。另一方面,即使我们将循环的情形排除,这棵树上的节点数量也已多到了无法处理的程度。以中国象棋为例,其每一局面可有约20 ! 60 种走法。以平均40 种走法计,建立一棵(双方各走50 步)搜索树就需生成约10160个节点。这远远超出了当今计算机的处理能力。即使生成一个节点仅需10-8秒,生成这棵树也要10140年以上。显然这是不切实际的;也就是说,必须得有其他切合实际的方法。
4.2极大极小值算法(M inimax Algorithm)②
在上面的博弈树中,如果我们令甲胜的局面值为1,乙胜的局面值为-1,而和局的值为0。当轮到甲走时,甲定会选择子节点值最大的走法;而轮到乙时,乙则会选择子节点值最小的走法。所以,对于中间节点的值可以有如下计算方法:如果该节点所对应的局面轮到甲走棋,则该节点的值是其所有子节点中值最大的一个的值。而如果该节点所对应的局面轮到乙走棋,则该节点的值是其所有子节点中值最小的一个的值。
对博弈树的这个变化仅仅是形式上的,本质上丝毫未变,但是这个形式更容易推广以运用到一般实际的情形。
既然建立整棵的搜索树不可能,那么,为当前所面临的局面找出一步好棋如何?也就是通过少量的搜索,为当前局面选择一步较好的走法。
在通常的棋局当中,一个局面的评估往往并不像输、赢、平3 种状态这么简单,在分不出输赢的局面中棋局也有优劣之分。也就是说,要用更细致的方法来刻画局面的优劣,而不是仅仅使用1、-1、0 三个数字刻画 3 种终了局面。假定我们有一个函数可以为每一局面的优劣评分。例如甲胜为+∞;乙胜为-∞;和局为0;其他的情形依据双方剩余棋子的数量及位置评定-∞! +∞之间的具体分数。这样我们可以建立一棵固定深度的搜索树,其叶子节点不必是终了状态,而只是固定深度的最深一层的节点,其值由上述函数评出;对
于中间节点,如同前面提到的那样,甲方取子节点的最大值,乙方取子节点的最小值。这个评分的函数称作静态估值函数(Static Evaluation Function)。用以取代超出固定深度的搜索。显然,我们无法拥有绝对精确的静态估值函数。否则,只要这个静态估值函数就可以解决所有的棋局了。估值函数给出的只是一个较粗略的评分,在此基础上进行的少量搜索的可靠性,理论上是不如前述的W IN,LOST,DRAW 三种状态的博弈树的,但这个方法却是可实现的。利用具体的知识构成评估函数的搜索叫做启发式搜索(Heuristic Search)。估值函数在有些文献中也称为启发函数(Heuristic Function)。
在博弈树搜索的文献当中,极大极小方法往往指的是基于静态估值函数的有限深度的极大极小搜索。本书在将来使用极大极小方法时如无特别说明也是指这种形式。
4.3 深度优先搜索(Depth FirstSearch)
在生成极大极小树并对其进行搜索的方法上,我们面临着多种选择。
1>是先在内存中生成整棵树然后进行搜索,还是在搜索的过程中仅仅产生将要搜
索的节点?
②可能是冯·诺依曼(John V on Neumann)最早提出极大极小值算法。冯氏于1928 年提出“二人
零和博弈的极大极小解决方法(The minimax solution fora two-person zero-sun game)”,1944 年与
摩根斯特恩(OskarMorgenstern)合作发表“博弈论和经济行为(Theory ofGamesand Economic
Behavior”,奠定了博弈论在经济学上的重要地位。冯氏的极大极小方法是广义的,包含前一节的
内容。后来John C.Harsanyi,John F.Nash及Reinhard Selten 3 人也因为对抗性博弈中的均衡问
题的开创性分析共同获得了1994 年的诺贝尔经济学奖,显示博弈论在当代经济学中的重要性。
进一步的内容可参见诺贝尔电子博物馆(NOBEL e-MUSEUM ,www.nobel.se)。
2>对于树的搜索以什么顺序进行,是广度优先(Breadth FirstSearch)深度优先,还
是其他顺序?
3>有必要生成整棵树吗?在搜索过程中将搜索过的节点删去行吗?
几乎所有的人在使用基本的极大极小算法时都选择了深度优先搜索方法。这样可以在搜索过程中的任何时候仅仅生成整棵树的一小部分,搜索过的部分被立即删去。显然,这个算法对内存的要求极低,往往在内存只有几千字节的机器上也可以实现。并且同其他的选择相比,速度上也并不逊色。
深度优先搜索极大极小树的过程,可以表示为一个递归的形式。
如图 4.2 所示的一棵树,共有 3 层。根节点为A,其子节点有B、C、D 三个,而B、C、D 也各有子节点若干。以深度优先算法搜索此树时,先进入根节点A,生成其第1 个子节点B;然后遍历B,生成B 的第1 个子节点E;E 将其估值返回给父节点B,删掉E,B 生成第2 个子节点F;F 将其估值返回给父节点B,删掉F,B 生成第3 个子节点G;G 将其估值返回给父节点B,删掉G,B 在3 个叶节点的返回值中取极小值并将此值返回给A,A 生成其第 2 个子节点C;同样遍历 C 及其子节点,得到 C 的返回值后再生成D 并向下遍历之;最后,A 在B、C、D 的返回值中取极大值,拥有该极大值的子节点就是下一步要走的方向。
图 4.2 深度优先搜索实例