收藏 分享(赏)

博弈算法博弈算法.ppt

上传人:lxhqcj 文档编号:7281220 上传时间:2019-05-12 格式:PPT 页数:42 大小:663KB
下载 相关 举报
博弈算法博弈算法.ppt_第1页
第1页 / 共42页
博弈算法博弈算法.ppt_第2页
第2页 / 共42页
博弈算法博弈算法.ppt_第3页
第3页 / 共42页
博弈算法博弈算法.ppt_第4页
第4页 / 共42页
博弈算法博弈算法.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

1、博弈算法,对策论(博弈论、游戏论或策略论),田忌赛马早在战国的时候,中国就流行赛马赌胜的游戏。当时齐国的大将田忌就常常与齐国国君齐威王进行赛马,但每次比赛都是田忌输,齐威王赢。这是什么道理呢?原来田忌上、中、下三等马,齐威王也有上、中丁三等马,但田忌的三等马都分别比齐威王的三等马略差一些。田忌输得很不甘心,又想不出什么好的办法。这时候田忌的谋士孙膑就对田忌说,你再去与齐威王赛一次马,而且把赌注押得多一点,这一次我保证你能赢。田忌素来很信任孙膑,就又去邀齐威王赛马,并且押下了每场比赛一千两黄金的大赌注。比赛开始了,齐威王第一场就派出了它的上等马,田忌刚要派他的上等马去应战,孙膑却不让田忌派上等马

2、,而让他派下等马去应战,结果自然是输了。第二场,齐威王派出中等马,孙膑则让田忌出上等马,结果赢回一场。到了第三场,齐威王只有下等马了。田忌则派出了中等马,结果又赢了一场。三场比赛结束,田忌先输一场,后赢两场,总计还是赢了一场,终于赢到了齐威王的一千两黄金。,二人有限零和对策,首先,参加这个赛局的有两方,一方是田忌,一方是齐威王,所以称“二人策”;其次,田忌有马三等,齐威王也有马三等,双方各用哪一等马去对付对方的哪一等马,其策略个数是有限的,所以又称“有限对策”;最后,每场比赛赌注千金,输方要拿出一千两黄金,而赢方则得到一千两黄金,双方输赢之和恰等于零,所以又称“零和对策”。对于田忌来说,他虽然

3、也有上、中、下三等马,但每等都比齐威王的差,明显地处于劣势的地位。在这样的情况下,如何找到一种最优的策略,使劣势变为优势,就成了田忌能否取胜的关键。,赛马策略,设田忌的三等马为A、B、C,齐威王的三等马为a、b、c。)很明显,在田忌所有可能采取的六个策略中,有五个都是要输的其中第(1)种输三千两黄金,第(2)(3)(4)(5)种各输一千两黄金只有一个策略,也即是第()种策略,才有可能取胜。而孙膑所采取的,正是这个唯一能取胜的策略。我们从他让田忌多下赌注这样有把握的话来看,则可知他对于双方形势的优劣消长,各种策略的利害得失,必然是经过了一番详细的分析和周密的思考的。详细地分析敌我情况,反复地研究

4、各种对策,在所有可能采取的策略中选择一个利多弊少的最优策略,从而使劣势变为优势,最终取得胜利,这正是对策论的基本思想。,一个简单的问题,Grundy博弈有一堆数目为n的钱币,由两位选手轮流进行分堆,要求每个选手每次只把其中某一堆分成数目不等的两小堆。例如选手甲把n分成两堆后,轮到乙就可以挑其中一堆来分,如此进行下去,直到有一位选手先无法把钱币分成不相等的两堆时就得认输。,状态空间图,与或图,规则:if (x1,xn,Max) and (xi=y+z,yz)then (x1,xi-1,y,z,xi+1,xn,Min) 上图节点A是Max的目标,而节点B,C则是Min的目标。 搜索策略需要考虑的问

5、题是: 对Min走后的每一个Max节点,必须证明Max对Min可能的每一个棋局对弈后能获胜,即Max必须应付Min的所有的招法,这是一个“与” 的含义,因此,含有Max的节点可看成与节点。 对Max走后的每一个Min节点,只须证明Max有一步走赢就可以,即Max只要考虑走一步棋使Min无法招架就成,因此含有Min的节点可看成“或” 节点。 这样对弈过程的搜索图就呈现出“与或图”的形式。,Grundy的与或搜索图,极大极小搜索,博弈程序的任务就是对博弈树进行搜索找出当前最优的一步行棋。对博弈树进行极大极小搜索,可以达到这一目的。极大极小搜索,是因为博弈双方所要达到的目的相反,一方要寻找的利益恰是

6、一方失去的利益,所以博弈的一方总是希望下一走是儿子节点中取值最大者,而另一方恰恰相反。这便形成了极大极小过程。 当然,程序不能也没有必要做到搜索整棵博弈树的所有节点,对于一些已经确定为不佳的走步可以将以它为根节点的子树剪掉。 而且,搜索也不必真地进行到分出胜负的棋局,只需要在一定深度范围内对局面进行评价即可。只有搜索空间缩小到一定程度,搜索才可以真正的进行。当搜索进行到一定深度,用局面评价机制来评价棋局,按照极大极小的原则选出最优,向上回溯,给出这一局面的父亲节点的价值评价,然后再继续向上回溯,一直到根节点,最优走步就是这样搜索出来的,估价函数,极大极小搜索策略是考虑双方对弈若干步之后,从能的

7、走步中选一步相对好棋的着法来走,即在有限的搜索深度范围内进行求解。 为此,要定义一个静态估价函数 f,以便对棋局的势态作出优劣估值,这个函数可根据事态优劣特征进行定义,一般规定有利于Max的势态f(p)取正值,有利于Min的势态f(p)取负值,势均力敌,f(p)=0 因此,f(p)=+,表示Max赢, f(p)=-表示Min赢。 规定,顶点的深度为0,Max表示程序方,Min表示对手方 对于Min节点,应考虑最坏的情况,故其估计值应取其子节点的最小值,而对于Max节点,可考虑最好的情况,故取其子节点的最大值。,极大极小的取值过程,如上图,极大极小层交互出现,极小层取两个他们的最小值,极大层取他

8、们的最大值。,基本博弈搜索算法,极大极小值算法(Minimax Algorithm)始终站在博弈一方的立场上给棋局估值,有利于这一方的棋局给予一个较高的价值分数,不利于这一方(有利于另一方)的给予一个较低的价值分数,双方优劣不明显的局面给予一个中间价值分数。在这一方行棋的时候,选择价值极大的儿子节点走步,另一方行棋则选择价值极小的儿子节点走步。 负极大值搜索(Negamax Algorithm) 1975年Knuth和Moore提出,旨在消除两方面的差别,使算法简洁优雅,核心思想在于:父节点的值是各子节点的负数的极大值。,极大极小的算法框架,第一步:从s节点出发按宽度有先的方法,生成规定深度范

9、围的博弈树。假设搜索的最大深度为K: 初始化博弈树,放入初始节点s入open表; closed:=() ; repeat if n 可直接判定赢、输或平局 then f(n)+/-/0else ni expand(n); add(ni, T); depth:=depth(n)+1add(ni, open); add(n,closed); remove(n, open); n open表的第一个节点 until open表为空 or depthk,极大极小的算法框架,第二步:对该博弈树,自底向上逐级计算每个节点的静态估价函数值。按给定的估价函数计算最底层的静态估价函数值; repeat 从下往上

10、倒推计算各估计值 if f(s)nil then 游戏退出或开始走步 n closed表的第一个节点 if n Max方 and f(nci)有值 then f(n)Max f(nci) ; remove(n,closed) if n Min方 and f(nci)有值 then f(n)Min f(nci) ; remove(n,closed) until closed表为空;第三步:按找估价函数值决定走步,如果对手响应走步以后,再以当前状态作为起始状态s,转第一步。,#棋游戏,在九宫棋盘上,两位选手轮流在棋盘上摆各自的棋子(每次一枚),谁先取得三子一线,谁就取胜。 设程序方Max用黑子“”

11、,而对手Min用白子“” 估计函数:f(p) = 所有空格都放上黑子后,Max的三子成线总数- 所有空格都放上白子后,Min的三子成线总数若p为Max方获胜,则f(p)=+p为Min方获胜,则f(p)=-右图的f(p)=6-4=2由f(p)0可以看出,这个棋局的对Max有利。,深度为2的#棋游戏的搜索过程(1),深度为2的#棋游戏的搜索过程(2),深度为2的#棋游戏的搜索过程(3),-剪枝,-剪枝,剪枝:若任一极小值层节点的值小于或等于它任一先辈极大值层节点的值,即(先辈层) (后继层),则可终止该最小值层中这个Min节点的搜索过程。这个Min节点最终的倒推值就确定为值。 剪枝:若任一极小值层

12、节点的值大于或等于它任一先辈极大值层节点的值,即(后继层) (先辈层),则可终止该最大值层中这个Max节点的搜索过程。这个Max节点最终的倒推值就确定为值。 -效率分析若以理想的情况搜索,即对Min先扩展最底估计值节点,对Max先扩展对高估计值的节点,则搜索深度为d,分支个数为B时,用-剪枝,生成的端节点数最少,为n = 2Bd/2 (d为偶数), n = B(d+1)/2+ B(d-1)/2 -1 (d为奇数),-剪枝,-剪枝,Alpha-Beta搜索的增强算法,1. 渴望搜索(Aspiration Search)在alpha-beta剪枝过程中,初始的的搜索窗口往往是从-(即初始的alph

13、a值)到+(初始的beta值),在搜索进行中再不断缩小窗口,加大剪枝效果。 2. 极小窗口搜索(Minimal Window Search) 用极小的窗口来限制剪枝范围 ,在根节点处,假定第一个儿子节点为主变量,也就是假定它为最佳走步,对它进行完整窗口(a,b)的搜索并得到一个返回值v,对后面的儿子节点依次用极小窗口(也被称为是零窗口)(v,v+1)来进行搜索,如果搜索返回值大于零窗口,则证明这一分支亦为主变量,对它进行窗口为(v+1,b)的搜索,可是如果返回值小于零窗口,这一分支就可以忽略,因为它的最佳走步还不如已有的走步。,Alpha-Beta搜索的增强算法,3. 置换表(Transpos

14、ition Table) 在搜索进行中,查询所有的走步,经常会在相同的或者不同的路径上遇到相同的棋局,这样的子树就没有必要重复搜索,把子树根节点的估值、子树的最好走步和取得这个值的深度信息保存在一个称为置换表的数据结构中,下次遇到时直接运用即可。 4. 遍历深化(Iterative Deepening) 算法的过程是,对以当前棋局为根节点的博弈树进行深度为二的遍历,得出其儿子节点的优劣排序,接着再从根节点进行深度为三的遍历,这一次优先搜索上次遍历中得出的最优者,从而加大剪枝效果,以此类推,在进行第三次、第四次的遍历,一直达到限定时间为止。,Alpha-Beta搜索的增强算法,5. 历史启发搜索

15、(History Heuristic) 历史启发也是迎合alpha-beta搜索对节点排列顺序敏感的特点来提高剪枝效率的,即对节点排序,从而优先搜索好的走法。所谓好的走法即可以引发剪枝的走法或者是其兄弟节点中最好的走法。一个这样的走法,一经遇到,就给其历史得分一个相应的增量,使其具有更高的优先被搜索的权利。 6. 杀手启发搜索(Killer Heuristic)杀手启发实际上是历史启发的特例。它是把同一层中,引发剪枝最多的节点称为杀手,当下次搜索时,搜索到同一层次,如果杀手走步是合法的话,就优先搜索杀手。,Alpha-Beta搜索的增强算法,7. MTD (f) 算法MTD(f)搜索的全称是M

16、emoryenhanced Test Driver with f and n。它是一个较新的算法,在1995左右年由Aske Plaat等人提出。 function MTD ( n, f ) f ; g := f ; f + := + ; f := ; / f为初值, f +上界, f 下界 repeatif g = f then := g + 1 else := g;g := alphabeta(n,-1,)if g then f + := g else f := g; until f f +; return g; /g为最好的走步,最佳优先算法,1. SSS*和DUAL*算法这两种算法即为

17、状态空间搜索(State Space Search),由Stockman在1979年提出。它们是把极大极小树的搜索看成是对状态图的搜索,在不同的分支上展开多条路径,并且维护一个关于状态图的全局信息表。这两个算法的缺点是:算法复杂,难于理解;额外的数据结构占用空间大;并且维护有序的OPEN队列所用的时间开销大。 2. B*和PB*算法1969年Berliner提出了B*算法,用一个乐观值和一个悲观值来表示评价值。算法从这点出发,用这两个界来证明哪个节点是最好的。当根节点的一个孩子的悲观值不比所有其它节点的乐观值差的时候,B*算法就结束了。算法的搜索控制就是尽可能快的得到终止条件。B*算法的缺点是

18、它对局面的乐观值和悲观值的估计得可信赖程度,它对这个估值的依赖性太强。PB*算法就是基于概率的B*算法,由Paley在1983年提出。这个算法对概率的准确估计比较敏感,实现困难。,五子棋游戏,在一个15*15的棋盘中下黑白棋子,谁先将自己的五颗棋子连成一条直线,谁就获胜。 五子棋类似“#棋”,不过棋盘扩大了很多,这样,如果还按类似博弈树地扩展,整棵搜索树相当庞大。 因此在建立搜索树的过程不是简单扩展,而是要根据“经验”扩展部分搜索树进行检测,选取那些相对“较好”的节点。,搜索过程考虑的几个问题,估价函数的设计:对于一个局面,考察他活三,冲四等等的个数,综合局面中黑白子连通块的大小个数等等来计算

19、函数值。具体的函数值需要反复的实践才能选出最好,并不能一概而论。 Max、Min局面:我们定义g(x)表示局面x对于机器的估价函数值,f(x)表示局面x对于机器的实际函数值。那么我们可知在Max局面:f(x)=maxf(k),在Min局面:f(x)=minf(k),k是x走一步能到达的状态。 搜索的宽度和深度:我们可以在当递归调用了MaxD(一个常量)层之后,直接令f(x)=g(x)。在搜索的宽度上,我们知道一个局面同时可以有15*15=225种不同的走法之多,我们不可能对于每一步都去搜索。否则会严重影响搜索的深度,也无法在有限的时间内达到最高的效率。我们约定对于局面x,只搜索g值排序靠前Ma

20、xW(一个常量)的子局面。 剪枝:Alpha-Beta剪枝策略。,一些优化的其他思考,定式优化,一些开局和局部的变化有据可查,可建立这样的数据库表,以便实施对应的策略。 对于“冲四点”、“活三点”、“双三点”、“死点无论走都没用” 等进行估计,采用好的估计函数值来选择“好点”。 考虑用侧重防守策略还是策略防守:优先考虑封堵。进攻:优先考虑冲四、冲三 考虑对手的第几步,即搜索的深度选择,可以根据棋局的变化深度逐渐减小。 考虑五子棋的特殊性,下子尽量离有子范围2格以内,减少搜索范围。 建立专家数据库,用来存储每次失败的经验教训,分析和调整对应的策略,L-game( Baltic OI 2002 )

21、,The L Game was designed by Edward de Bono who enjoys playing games and yet hates to concentrate on a large number of pieces. The intention was to produce the simplest possible game that could be played with a high degree of skill. The L game was the result. Each player has only one piece, an L piec

22、e. There are also two neutral square pieces. The board is four squares by four squares. The object of the game is to manoeuvre the other player into a position on the board where he cannot move his L piece. Proceeding from the starting position, the first player (and each player on each move thereaf

23、ter) must move the L piece first. When moving, a player may slide, turn or pick up and flip the L piece into any open position other than the one it occupied prior to the move. When the L piece has been moved, a player may move either one (but only one) of the neutral square pieces to any open squar

24、e on the board. It is not required that a neutral piece be moved, this is up to the player!,From any of the three positions above, the player with the checkered L can move his L piece to two new locations (the other two of the three positions above). After moving the L piece, he can move one of the

25、neutral pieces to any of the 6 remaining empty squares or decide not to move any of the neutral pieces. All in all, there are 2 * (6 + 6 + 1) possible moves. A player wins the game when his opponent cannot move his L piece. In the position below, if the player with the checkered L is to move, he los

26、es, as he cannot move his L to a new, unoccupied position on the board.,The game is simple, yet hard as there are so many moves. There are over 18,000 positions for the pieces on the small board and at any moment there may be as many as 195 different moves of which only one is successful. Write a pr

27、ogram that given the position of the pieces and which player is to move, decides if the player has a winning move and output such a move if it exist. If there exist several winning moves, output any one of them. If no winning move exists, you should decide whether the game will end in a draw (assumi

28、ng perfect play from both players), or if the player to move will in fact lose. A winning move is defined as a move that, no matter how the opponent plays, he cannot avoid losing the game if the player who is about to move continues the game playing perfectly.,A player is losing the game if, no matt

29、er which move he plays, he cannot avoid losing if the opponent continues to play the game perfectly. If neither of these conditions hold (that is, none of the players can force a win), we say the game position is a draw. Input data The input file lgame.in consists of four lines describing the positi

30、on of a game in progress. A dot (.) represents an empty square, an x (lowercase X) represents a neutral square piece, # represents the L piece of the player A and * represents the L piece of the player B. The player A is about to move. You may assume that the position is legal and that the player to

31、 move has at least one legal move from the current position. Output data Output data should be written to the file lgame.out. If a winning move exists, output the position after the winning move, using the same format as the input. Otherwise output No winning move on a line by itself, and on the nex

32、t line either Draw if the game will end in a draw (assuming perfect play) or Losing if the player to move will lose the game.,题目大意,一个4*4的棋盘,放有两个L形和两个小圆球;其中一个L形被先手控制、另一个被后手控制。 两个人轮流走棋。一个人每一步可以将L形拿起然后重新放入棋盘中的任何新位置(不能放在原来的位置,可以翻转、旋转);然后他可以选择任意一个小圆球移动到新的位置、也可以不移动小圆球,这由他决定。 一旦某人不能走了,就输了。输入一个状态,判断先手是必胜、必败

33、还是平局。(假设两个人都足够聪明),算法梗概,经典的博弈模型。将局面抽象成顶点,在可以一步转换的棋局之间连接有向边。 如果一个点必胜,必须满足:他至少有一个后继点是必败点。 如果一个点必败,必须满足:他所有的后继点都是必胜点;或者他根本没有后继点。 除了必胜和比败点就是平局。 本文采取一定的扩展顺序得到必胜、必败、平局的所有状态集合,然后根据输入数据逐个判断之。,博弈模型,对任意一个棋盘,我们规定画竖线的L形先走。 图1中的状态能通过一步转化到图2的状态。但是由于规定画竖线的L形必须先走,因此我们略作修改: 称图3可“直达”图4”。 我们把棋盘状态抽象成点,如果A棋盘可以直达B棋盘,就连一条有

34、向边AB。现在考察某个点V。 如果V的出度为0,也就意味着先手无法做有效的移动,V是一个先手必败策略。 假设V的出度为d,这d个后继节点是u1, u2, , ud。当且仅当存在ui(1id)是先手必败节点,V是一个先手必胜点。因为如果存在这样的点,处于V的先手可以把ui这个必败的状态留给对手,他就胜利了。,算法框架,假设V的出度为d,这d个后继节点是u1, u2, , ud。当且仅当每一个ui(1id)都是先手必胜节点,V是一个先手必败点。因为处于V的先手无论怎么走都会把一个必胜的状态留给对手,所以他必败。 因此我们设计如下算法:1. 构图 2. 设置两个队列Win和Lose,分别存储的是必胜

35、状态和必败状态。一开始Win=,Lose=所有出度为0的点 3. 如果存在某个既不属于Win也不属于Lose的点V,满足:V的某个后继节点属于Lose。则令WinWin+V 4. 如果存在某个既不属于Win也不属于Lose的点V,满足:V的所有后继节点都属于Win。则令LoseLose+V 5. 若第3、4步中存在这样的点V,则转3;否则转6 6. 令Draw = 所有状态-Win-Lose执行上述算法后,所有的必胜状态都保存在Win中;所有的必败状态都保存在Lose中;所有的平局都保存在Draw中。,进一步分析,Win和Lose好理解,可是为什么除Win和Lose之外的状态就都是平局呢? 考

36、虑某个点V属于Draw。显然V的后继节点不可能是必败点,否则根据规则V就会被归到Win中;所以V的所有后继节点都是必胜或者Draw中的点,而且至少有一个Draw中的点(否则根据规则就会被归入到Lose中)。 如果你是先手,面对V这样的局面,你肯定不会把一个必胜的状态留给对手(因为这样你就输了!),所以你肯定会往一个Draw中的点走。 类似的,对手也不会把必胜留给你,也往一个Draw的点走如是反复,你们两个就老在Draw中的点打转转。这样永远也走不完的棋局不就是平局吗? 所以我们可以肯定Draw中的状态都是平局。 根据上述算法求出Win、Draw、Lose后,只需根据输入的棋局判断其属于哪个集合

37、即可确定答案。,具体实现,先看程序的第三步:“如果存在某个既不属于Win也不属于Lose的点V,满足:V的某个后继节点属于Lose。则令WinWin+V”。 我们当然不需要真的去枚举所有的点V,然后一个个的判断是否符合要求。只要每次更新Lose的时候(包括第二步中的更新),设V是即将加入Lose的点,我们就把所有指向V的点都放到Win中去。 再看第四步:“如果存在某个既不属于Win也不属于Lose的点V,满足:V的所有后继节点都属于Win。则令LoseLose+V”。 我们不需要也不可能去枚举每个V然后逐一判断。可以设di表示点i的出度;然后每次更新Win的时候,设V是即将加入Win的点,将所

38、有指向V的点的出度减1;一旦发现某个点的出度为0则将其加入Lose。 然后还要考虑状态的判重。经过初步的搜索发现只有18368种不同的状态,完全可以用Hash表保存。我们要设法设计一种既简单、又高效的Hash函数。,HASH表,L形只有8种不同的形状,如下:,对于任意一种形状,在4*4的网格中有6种放置的方式。以某一个为例说明:因此一个L形在棋盘中的状态就能用一个18*6的整数来表示,另外两个空格可以用116*15/2的整数表示。,结论,L于是一个棋盘就可以用一个三元组(L1, L2, Space)(1L1, L248,1Space120),L1表示先手的L形、L2表示后手的L形、Space表示空格的位置。 我们可以开一个array148,148,1120的数组作为Hash表,这样存储、读取的复杂度为常数级别。空间上仅仅需要270K即可。 容易发现一个状态必然对应着一个三元组(L1, L2, Space);但是反过来一个三元组(L1, L2, Space)却不见得对应一个合法的状态。因此实际上存在着大量的不可能利用空间。这实际上是一种以空间换时间的策略,在空间不太紧张的状况下是一种常用的策略。 注意以上几点就能较好的完成此题。 每条边都只遍历一次,故而此题复杂度是O(E)。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报