大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
(基本覆盖了比赛中常用到的博弈论知识点,之前整理的,最近要开始系统的看博弈论,先找出来复习一下。)
零和与非零和博弈
先谈几个概念:
零和博弈:又称零和游戏,与非零和博弈相对,是博弈论的一个概念,指参与博弈的各方,在严格竞争下,一方的收益必然意味着另一方的损失,博弈各方的收益和损失相加总和永远为“零”。双方不存在合作的可能。也可以说:自己的幸福是建立在他人的痛苦之上的,二者的大小完全相等,因而双方都想尽一切办法以实现“损人利己”。零和博弈的例子有:赌博、期货、股票投机等。非零和博弈:博弈中各方的收益或损失的总和不是零值,它区别于零和博弈。在经济学研究中很有用。在这种状况时,自己的所得并不与他人的所失的大小相等,连自己的幸福也未必建立在他人的痛苦之上,即使伤害他人也可能“损人不利己”,所以博弈双方存在“双赢”的可能,进而合作。非零和博弈的例子:譬如,在恋爱中一方受伤的时候,对方并不是一定得到满足。也有可能双方一起能得精神的满足。也有可能双方一起受伤。通常,彼此精神的损益不是零和的。比如目前的中美关系,就并非“非此即彼”,而是可以合作双赢。不过想想看在这样的利益交换之下,牺牲掉谁的利益?
帕累托最优:也称为帕累托效率,是经济学中的重要概念,并且在博弈论、 工程学和社会科学中有着广泛的应用。 与其密切相关的另一个概念是帕累托改善。帕累托最优是指资源分配的一种理想状态。假定固有的一群人和可分配的资源,如果从一种分配状态到另一种状态的变化中,在没有使任何人境况变坏的前提下,使得至少一个人变得更好,这就是帕累托改善。帕累托最优的状态就是不可能再有更多的帕累托改善的状态;换句话说,不可能再改善某些人的境况,而不使任何其他人受损。需要指出的是,帕累托最优只是各种理想态标准中的“最低标准”。也就是说,一种状态如果尚未达到帕累托最优,那么它一定是不理想的,因为还存在改进的余地,可以在不损害任何人的前提下使某一些人的福利得到提高。但是一种达到了帕累托最优的状态并不一定真的很“理想”。比如说,假设一个社会里只有一个百万富翁和一个快饿死的乞丐,如果这个百万富翁拿出自己财富的万分之一,就可以使后者免于死亡。但是因为这样无偿的财富转移损害了富翁的福利(假设这个乞丐没有什么可以用于回报富翁的资源或服务),所以进行这种财富转移并不是帕累托改进,而这个只有一个百万富翁和一个饿死乞丐的社会可以被认为是帕累托最优的。(这里可以与古典功利主义的标准做一比较。按功利主义的标准,理想的状态是使人们的福利的总和最大化的状态。如果一个富翁损失很少的福利,却能够极大地增加乞丐的福利,使其免于死亡,那么社会的福利总和就增加了,所以从功利主义的角度看,这样的财富转移是一种改善,而最初的极端不平等状态则是不理想的,因为它的福利总和较低。可以看到,帕累托改进要求在提高某些人福利的时候不能减少任何一个人的福利,而功利主义则允许为了提高福利总和而减少一些人的福利。)
经济学理论认为,如果市场是完备的和充分竞争的,市场交换的结果一定是帕累托最优的,并且会同时满足以下3个条件:1. 交换最优:即使再交易,个人也不能从中得到更大的利益。此时对任意两个消费者,任意两种商品的边际替代率是相同的,且两个消费者的效用同时得到最大化。2. 生产最优:这个经济体必须在自己的生产可能性边界上。此时对任意两个生产不同产品的生产者,需要投入的两种生产要素的边际技术替代率是相同的,且两个消费者的产量同时得到最大化。3. 产品混合最优:经济体产出产品的组合必须反映消费者的偏好。此时任意两种商品之间的边际替代率必须与任何生产者在这两种商品之间的边际产品转换率相同。
如果一个经济体不是帕累托最优,则存在一些人可以在不使其他人的境况变坏的情况下使自己的境况变好的情形。普遍认为这样低效的产出的情况是需要避免的,因此帕累托最优是评价一个经济体和政治方针的非常重要的标准。但是,如同上面指出的,一个帕累托最优的经济系统只是在“最低”的意义上是“理想”的,并不能保证其中没有贫困或严重的贫富差距。
帕累托最优是以提出这个概念的意大利经济学家维弗雷多·帕雷托的名字命名的, 维弗雷多·帕雷托在他关于经济效率和收入分配的研究中使用了这个概念
囚徒困境
囚徒困境是博弈论的非零和博弈中具代表性的例子,反映个人最佳选择并非团体最佳选择。虽然困境本身只属模型性质,但现实中的价格竞争、环境保护等方面,也会频繁出现类似情况。单次发生的囚徒困境,和多次重复的囚徒困境结果不会一样。
在重复的囚徒困境中,博弈被反复地进行。因而每个参与者都有机会去“惩罚”另一个参与者前一回合的不合作行为。这时,合作可能会作为均衡的结果出现。欺骗的动机这时可能被受到惩罚的威胁所克服,从而可能导向一个较好的、合作的结果。作为反复接近无限的数量,纳什均衡趋向于帕累托最优。
囚徒困境的主旨为,囚徒们虽然彼此合作,坚不吐实,可为全体带来最佳利益(无罪开释),但在资讯不明的情况下,因为出卖同伙可为自己带来利益(缩短刑期),也因为同伙把自己招出来可为他带来利益,因此彼此出卖虽违反最佳共同利益,反而是自己最大利益所在。但实际上,执法机构不可能设立如此情境来诱使所有囚徒招供,因为囚徒们必须考虑刑期以外之因素(出卖同伙会受到报复等),而无法完全以执法者所设立之利益(刑期)作考量。
1950年,由就职于兰德公司的梅里尔·弗勒德(Merrill Flood)和梅尔文·德雷希尔(Melvin Dresher)拟定出相关困境的理论,后来由顾问艾伯特·塔克(Albert Tucker)以囚徒方式阐述,并命名为“囚徒困境”。经典的囚徒困境如下:
警方逮捕甲、乙两名嫌疑犯,但没有足够证据指控二人有罪。于是警方分开囚禁嫌疑犯,分别和二人见面,并向双方提供以下相同的选择:
* 若一人认罪并作证检控对方(相关术语称“背叛”对方),而对方保持沉默,此人将即时获释,沉默者将判监10年。* 若二人都保持沉默(相关术语称互相“合作”),则二人同样判监半年。* 若二人都互相检举(互相“背叛”),则二人同样判监2年。
甲沉默(合作) 甲认罪(背叛) 乙沉默(合作) 二人同服刑半年 甲即时获释;乙服刑10年 乙认罪(背叛) 甲服刑10年;乙即时获释 二人同服刑2年
囚徒困境假定每个参与者(即“囚徒”)都是利己的,即都寻求最大自身利益,而不关心另一参与者的利益。参与者某一策略所得利益,如果在任何情况下都比其他策略要低的话,此策略称为“严格劣势”,理性的参与者绝不会选择。另外,没有任何其他力量干预个人决策,参与者可完全按照自己意愿选择策略。
囚徒到底应该选择哪一项策略,才能将自己个人的刑期缩至最短?两名囚徒由于隔绝监禁,并不知道对方选择;而即使他们能交谈,还是未必能够尽信对方不会反口。就个人的理性选择而言,检举背叛对方所得刑期,总比沉默要来得低。试设想困境中两名理性囚徒会如何作出选择:
* 若对方沉默、我背叛会让我获释,所以会选择背叛。
* 若对方背叛指控我,我也要指控对方才能得到较低的刑期,所以也是会选择背叛。
二人面对的情况一样,所以二人的理性思考都会得出相同的结论——选择背叛。背叛是两种策略之中的支配性策略。因此,这场博弈中唯一可能达到的纳什均衡,就是双方参与者都背叛对方,结果二人同样服刑2年。
这场博弈的纳什均衡,显然不是顾及团体利益的帕累托最优解决方案。以全体利益而言,如果两个参与者都合作保持沉默,两人都只会被判刑半年,总体利益更高,结果也比两人背叛对方、判刑2年的情况较佳。但根据以上假设,二人均为理性的个人,且只追求自己个人利益。均衡状况会是两个囚徒都选择背叛,结果二人判监均比合作为高,总体利益较合作为低。这就是“困境”所在。例子华丽地证明了:非零和博弈中,帕累托最优和纳什均衡是相冲突的。
固定局数的囚徒困境
试想像囚徒困境的情况进行十次。
我们可以合理地设想,如果囚徒第一次被对方指控,第二次这个囚徒也会指控对方。相反,如果第一次别人保持沉默,建立了互信的关系,你也会保持沉默,达致帕累托最优。
当然,两个囚徒都会有相似的想法,在第一局保持沉默,以期望建立互信关系,所以双方都会保持沉默。第二局时,双方亦应有相似的想法,继续保持沉默,以期继续在互信的情况下进行第三局,以致余下的八局。
这种想法合理吗?
在第十局时,互信的关系明显是没有意义的,因为十局已经完结,囚徒没有必要为维持互信的关系而沉默(没有第十一局),所以第十局囚徒一定会背叛对方的,理由和只有一局囚徒困境一样。
问题是,既然大家都知道在第十局,无论如何对方都会背叛自己的,你在第九局保持沉默也是没有意思的,要知道,保持沉默(友好关系)的原因是为了希望下一局别人保持沉默。所以第九局双方都一定会背叛对方的。
下一个问题是,双方都有相同的想法,明知第九局对方会背叛自己,所以第八局保持沉默也是没有意思的,第七局亦然,如此类推,纳什均衡是十局都会互相背叛,建立互信关系是没有可能的。
只有在囚徒困境的局数大家都不肯定的情况下,上述的推论才不会发生,才会出现互相保持沉默的现象。
现实的例子
上述例子可能显得不甚自然,但现实中,无论是人类社会或大自然都可以找到类似囚徒困境的例子,将结果划成同样的支付矩阵。社会科学中的经济学、政治学和社会学,以及自然科学的动物行动学、进化生物学等学科,都可以用囚徒困境分析,模拟生物面对无止境的囚徒困境博弈。囚徒困境可以广为使用,说明这种博弈的重要性。以下为各界例子:
政治学例子:军备竞赛
在政治学中,两国之间的军备竞赛可以用囚徒困境来描述。两国都可以声称有两种选择:增加军备(背叛)、或是达成削减武器协议(合作)。两国都无法肯定对方会遵守协议,因此两国最终会倾向增加军备。似乎自相矛盾的是,虽然增加军备会是两国的“理性”行为,但结果却显得“非理性”(例如会对经济造成都有损坏等)。这可视作遏制理论的推论,就是以强大的军事力量来遏制对方的进攻,以达到和平。
经济学例子:关税战
两个国家,在关税上可以有以两个选择:
1. 提高关税,以保护自己的商品。(背叛)
2. 与对方达成关税协定,降低关税以利各自商品流通。(合作)
当一国因某些因素不遵守关税协定,而独自提高关税(背叛)时,另一国也会作出同样反应(亦背叛),这就引发了关税战,两国的商品失去了对方的市场,对本身经济也造成损害(共同背叛的结果)。然后二国又重新达成关税协定。(重复博弈的结果是将发现共同合作利益最大。)
商业例子:广告战
商业活动中亦会出现各种囚徒困境例子。以广告竞争为例。
两个公司互相竞争,二公司的广告互相影响,即一公司的广告较被顾客接受则会夺取对方的部分收入。但若二者同时期发出质量类似的广告,收入增加很少但成本增加。但若不提高广告质量,生意又会被对方夺走。
此二公司可以有二选择:
1. 互相达成协议,减少广告的开支。(合作)
2. 增加广告开支,设法提升广告的质量,压倒对方。(背叛)
若二公司不信任对方,无法合作,背叛成为支配性策略时,二公司将陷入广告战,而广告成本的增加损害了二公司的收益,这就是陷入囚徒困境。在现实中,要二互相竞争的公司达成合作协议是较为困难的,多数都会陷入囚徒困境中。
自行车赛例子
自行车赛事的比赛策略也是一种博弈,而其结果可用囚徒困境的研究成果解释。例如每年都举办的环法自由车赛中有以下情况:选手们在到终点前的路程常以大队伍(英文:Peloton)方式前进,他们采取这策略是为了令自己不至于太落后,又出力适中。而最前方的选手在迎风时是最费力的,所以选择在前方是最差的策略。通常会发生这样的情况,大家起先都不愿意向前(共同背叛),这使得全体速度很慢,而后通常会有二或多位选手骑到前面,然后一段时间内互相交换最前方位置,以分担风的阻力(共同合作),使得全体的速度有所提升,而这时如果前方的其中一人试图一直保持前方位置(背叛),其他选手以及大队伍就会赶上(共同背叛)。而通常的情况是,在最前面次数最多的选手(合作)通常会到最后被落后的选手赶上(背叛),因为后面的选手骑在前面选手的冲流之中,比较不费力。
海盗分金币
有五个理性的海盗,A, B, C, D 和 E,找到了100个金币,需要想办法分配金币。
海盗们有严格的等级制度:A 比 B 职位高,B 比 C 高,C 比 D 高,D 比 E 高。
海盗世界的分配原则是:等级最高的海盗提出一种分配方案。所有的海盗投票决定是否接受分配,包括提议人。并且在票数相同的情况下,提议人有决定权。如果提议通过,那么海盗们按照提议分配金币。如果没有通过,那么提议人将被扔出船外,然后由下一个最高职位的海盗提出新的分配方案。
海盗们基于三个因素来做决定。首先,要能存活下来。其次,自己得到的利益最大化。最后,在所有其他条件相同的情况下,优先选择把别人扔出船外。
直觉上认为,A 海盗会给自己分配很少,以避免被扔出船外。然而这和理论结果相差甚远。
让我们反过来看:如果只剩下 D 和 E,D 给自己100个金币,给 E 0 个。因为 D 有决定权,所以分配达成。E 没有别的选择,他只能接受。
如果剩下三个人(C,D和E),C 知道 D 下轮会给 E 0 个金币,所以 C 这轮给 E 1个金币,让 E 支持自己以使得提议通过。因此如果剩下三个人,结果是C:99,D:0,E:1。E 会反对 C 的做法么?这样对它没有好处,假定它反对,把 C 扔出去对 E 也没有好处,就像我们上面分析的。
如果 B, C, D 和 E 剩下, B 知道上述结果。所以为了避免被扔出去,他只需要给 D 1 个金币,因为他有决定权,只需要 D 的支持就足够了。因此他会提议 B:99, C:0, D:1,E:0。有人可能想到提议 B:99, C:0, D:0,E:1,因为 E 知道即使把 B 扔出去,也不会得到更多了。但由于海盗会优先把别人扔出去,所以 E 会选择杀死 B,然后仍然可以从 C 的提议中得到相同金币。
假设 A 知道所有的一切,他就能选择让 C 和 E 来支持他,提议变成:A: 98 金币;B: 0 金币;C: 1 金币;D: 0 金币;E: 1 金币。
同样的 A:98,B:0,C:0,D:1,E:1 或者其他的提议都不是最好的,因为 D 会选择把A扔出去,然后从B 那里得到相同的金币。
通过这个例子我们可以在一定程度上了解博弈的本质,博弈并不是单纯的寻找最优方案或者最优解,博弈关心的是一方的行为对其他人造成的影响,这一点和许多最优化问题并不相同。
旅行者的困境
航空公司丢失了两位互相不认识乘客的旅行包。两个旅行包正好都是一样的,并且里面有相同价值的古董,两位乘客都向航空公司索赔 100 美元。为了评估出古董的真实价值,公司经理将两位乘客分开以避免两人合谋,分别让他们写下古董的价值,其金额要不低于 2 美元,并且不高于 100 美元。同时还告诉两人:如果两个数字是一样的,那么会被认为是其真实价值,他们能获得相应金额的赔偿。如果数字不一样,较小的会被认为是真实价值,而两人在获得这个金额的同时有相应的奖赏/惩罚:写下较小金额的会获得 2 美元额外的奖励,较大的会有 2 美元的惩罚。现在问题在于:两位旅行者应该用什么策略来决定他们应该写下的金额?
设身处地想一想的话,这个(2,2)是合理的,如果我预期那位乘客和我有不共戴天之仇的话,那么我会毫不犹豫写下2元的。这样的话,这个情况中并没有告诉我们古董的真实价格是多少,也没有告诉我们双方对彼此的映像,即使一面也没有见过的陌生人的话,更不会有不共戴天之仇吧,总的来说,我会写下古董真实价格 V 略低一些,毕竟,那两元的惩罚和奖励对我的激励并不大,影响我决策的更多的还是道德方面的因素。
猜均值的三分之二
在这个游戏中,若干个参与者被要求每人给出一个0到100之间的数字,所给出的数字最接近平均值2/3的那个人将会是获胜者。参与者之间并不知道其他人的选择。按照理性人的假设,参与者们应该会先排除不可能的数字。例如超过67的数字就不可能,因为当大家都选100时,平均值的三分之二才不过66。这样一来,每个人的选择又变成了在0到66之间选一个数,此时大于44的数字又变得没有意义了,接下来又是一个类似的循环……直到最后,所有理性人的选择应该都为0。
无偏组合游戏(ICG)
简单的取拿游戏
一堆石子(或者其它的什么东西),下面是简单的取拿游戏规则:
两名玩家,称为 I 和 II;
有一堆石子,一共 21 个;
一次移动操作包括取走 1 个,2 个,或者 3 个石子,至少得取走 1 个,至多取走 3 个。
玩家 I 先开始,交替取,不可不取。
取走最后一个石子的获胜。
我们可以反向推导。
如果只有 1 个,2 个或者 3 个石子留下,那么下一个将要移动的玩家获胜。
如果有 4 个留下,当前这个玩家取走后留下的石子数必然是 1 个,2 个或者 3 个,这样另一个玩家必胜,因此 4 对于将要开始移动的玩家而言是必败的局面,而对前一个玩家而言是必胜的局面。
如果有 5,6,7 个留下,玩家必须得给对方留下 4 个才能保证自己获胜。
如果有 8 个留下,那么下一个玩家必须留下 5,6,7 个,这样先前那个玩家获胜。
很容易发现,0,4,8,12,16 是我们希望留下的局面,我们希望状态尽可能向这些局面转化。由于本题起初是 21 个石子,由于 21 不是 4 的倍数,因此第一个玩家必然会赢,它只要留下的石子数是 4 的倍数对方就必然输。
这便是 bash 博弈。
P 态和 N 态
在前面的游戏中,0,4,8 等对于先前的玩家(Previous)而言是胜利的局面,称为 P 态。而 1,2,3,5,6,7,9,10,11.。。等对下一个玩家(Next)是胜利的局面,称为 N 态。
在这种无偏组合游戏中,可以从结尾倒推来找出 P 态和 N 态。
(1)、标志结尾局面为 P 态;
(2)、标志能达到 P 态的为 N 态;
(3)、找到那些能达到 N 态的为 P 态;
(4)、如果能找到更多的 P 态,转到(2);不然转到(3)。
很容易看到向 P 态移动会获胜,从一个 P 态开始,你的对手只能移动到 N 态,然后你再移动到 P 态,最终游戏在 P 态终结。
P 态和 N 态有几个特点:
(1)、所有的终结状态都是 P 态;
(2)、从每个 N 态开始,至少有一步能移到 P 态;
(3)、从每个 P 态开始,每一步的移动都是 N 态。
减法游戏
和上面的取石子游戏类似,假定有一个整数 n,两个玩家轮流从整数中减去一个数 s,其中 s 的取值来自集合 S,对于上面的取石子游戏,S = {1,2,3}。让我们通过类似的倒推找出 P 态。假定 S = {1,3,4}。容易发现 P 态集合是 {0,2,7,9,14,16,。。。}。所有态势集合形成一个循环节,长度为 7。
x 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ... position P N P N N N N P N P N N N N P ...
Wythoff’s Game (威佐夫博弈)
大致上是这样的:有两堆石子,不妨先认为一堆有 10,另一堆有 15 个,双方轮流取走一些石子,合法的取法有如下两种:
1、在一堆石子中取走任意多颗;
2、在两堆石子中取走相同多的任意颗;
约定取走最后一颗石子的人为赢家,求必胜策略。
两堆石头地位是一样的,我们用余下的石子数(a,b)来表示状态,并画在平面直角坐标系上。和前面类似,(0,0)肯定是 P 态,又叫必败态或者奇异局势。(0,k),(k,0),(k,k) 系列的节点肯定不是 P 态,你面对这样的局面一定会胜,只要按照规则取一次就可以了。再看 y = x 上方未被划去的格点,(1,2)是 P 态。k > 2 时,(1,k)不是 P 态,比如你要是面对(1,3)的局面,你是有可能赢的。同理,(k,2),(1 + k,2 + k)也不是 P 态,划去这些点以及它们的对称点,然后再找出 y = x 上方剩余的点,你会发现(3,5)是一个 P 态,如此下去,如果我们只找出 a <= b 的 P 态,则它们是(0,0),(1,2),(3,5),(4,7),(6,10)。。。。。。它们有什么规律吗?
忽略(0,0),很快会发现对于第 i 个 P 态的 a,a = i * (sqrt(5) + 1)/2 然后取整。。。而 b = a + i。居然和黄金分割点扯上了关系。
假设面对的局势是(a,b),若 b = a,则同时从两堆中取走 a 个物体,就变为了奇异局势(0,0);假定当前奇异局势是(a[k],b[k]),如果 a = a[k] ,b > b[k],那么,取走 b – b[k] 个物体,即变为奇异局势;如果 a = a[k] , b < b[k] ,则同时从两堆中拿走 a[k] – a[b – a[k]] 个物体,变为奇异局势( a[b – a[k]] , a[b – a[k]] + b – a[k]);如果a > a[k] ,b= a[k] + k,则从第一堆中拿走多余的数量a – a[k] 即可;如果 a < a[k] ,b= a[k] + k,分两种情况,第一种,a=a[j] (j < k),从第二堆里面拿走 b – b[j] 即可;第二种,a=b[j] (j < k),从第二堆里面拿走 b – a[j] 即可。
从如上性质可知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;反之,则后拿者取胜。
考虑这个问题的一个扩展:
有一堆个数为 n 的石子,游戏双方轮流取石子,满足:
1)先手不能在第一次把所有的石子取完;
2)之后每次可以取的石子数介于 1 到对手刚取的石子数的 2 倍之间(包含 1 和对手刚取的石子数的 2 倍)。
约定取走最后一个石子的人为赢家,求必败态。
这个和之前的 Wythoff’s Game 和取石子游戏有一个很大的不同点,就是游戏规则的动态化。之前的规则中,每次可以取的石子的策略集合是基本固定的,但是这次有规则 2:一方每次可以取的石子数依赖于对手刚才取的石子数。
这个问题居然和斐波那契数列有关,先下手的人获胜当且仅当总数量不是斐波那契数。
有个很有用的定理:任何正整数可以表示为若干个不连续的 Fibonacci 数之和。
比如,我们要分解 83,可以写成 83=55+28,而 28=21+7,7=5+2,故 83=55+21+5+2;
如果 n = 83,我们看看这个分解有什么指导意义:假如先手取 2 颗,那么后手无法取 5 颗或更多,而 5 是一个 Fibonacci 数,先手然后取走这 5 颗石子中的最后一颗,同样的道理,接下去先手取走接下来的后 21 颗中的最后一颗,再取走后 55 颗中的最后一颗,那么先手赢。
反过来如果 n 是 Fibonacci 数,比如 n = 89:如果先手第一次取的石子不小于 34 颗,那么一定后手赢,因为 89 – 34 = 55 = 34 + 21 < 2*34,此时第二个人只要将剩下的全部取光即可。故只需要考虑先手第一次取得石子数 < 34 即可,于是剩下的石子数 x 介于 55 到 89 之间,它一定不是一个 Fibonacci 数,于是我们把 x 分解成 Fibonacci 数:x = 55 + f[i] + … + f[j],如果 f[j] <= 先手一开始所取石子数 y 的两倍,那么对 B 就是面临 x 局面的先手,所以根据之前的分析,B只要先取 f[j] 个即可,以后再按之前的分析就可保证必胜。
Nim 博弈
从取石子游戏(Bash Game)到多堆的尼姆博弈是一个大进步,尼姆博弈的就是把取石子中的 1 堆变成了多堆。游戏者轮流从某一堆棋子中取走一个或者多个(这里暂时不限定每次最多能取几个),最后不能再取的就是输家。当指定相应数量时,一堆这样的棋子称作一个尼姆堆。
这里假定是 3 堆。
其实现在这个问题的一部分解决了——任意多堆的相同个数的 Nim 堆。而且很容易知道,(0,N,N)一定是必败态,如果有仔细尝试的话,可以发现(1,2,3)也是必败态,那到底有什么规律呢?
命题:(a,b,c) 是必败态等价于 p(a, b, c) = a xor b xor c = 0 ( xor 是异或运算)
如果我们面对的是一个非奇异局势 (a,b,c),要如何变为奇异局势呢?假设 a < b< c,我们只要将 c 变为 a xor b,即可,因为有如下的运算结果: 要将 c 变为 a xor b,只要从 c 中减去 c – (a xor b)即可。
推广到多个堆也是类似的办法。
Nim的一些变种
变种1: 取到最后一个石子的人输.
首先明确奇数个1是必败态, 偶数个1是必胜态. 这与正常的Nim不一致.
若只有一堆的个数大于1, 那么现在可以控制全场的1个数的奇偶性, 所以是必胜的. 这与正常的Nim一致.
若不止一堆的个数大于1, 由于不能转移到全是1的状态, (可能可以转移到仅有一堆大于1的状态, 但此状态与正常Nim一致), 所有当前可以转移到的状态的胜负性都是与正常的Nim一致的, 所以当前状态的胜负性与正常的Nim也是一致的.
综上, 除了全是1的状态胜负性跟正常的Nim不一致, 其余的状态胜负性与正常的Nim一致.
变种2: 只能从最左或最右的一堆中取, 取到最后一个的赢.
对于 [L,X,R] 状态, 若其是必败状态, 那么|L-R|<=1.
证明: 设[L,X,R]是必败态且R
游戏图与 SG 函数
前面几节谈到的游戏可以用图理论来描述,考虑一个图 G = (X, F);其中 X 是顶点,也是先前游戏中可能的态势。F 是一个函数,对于 X 中的任意一个 x,F(x) 的值都出现在 X 中,对于 X 的一个元素 x,F(x) 的含义是一个玩家从 x 出发可以移动到的局势。
对于一个两人的类似前面的游戏而言,可以在一个如此这样的图上进行博弈,首先指定一个起始点 x0,并使用下面的规则:
(1)玩家 I 从 x0 开始首先移动;
(2)玩家交替移动;
(3)在 x 态势时,玩家要将态势转移到另一个态势 y,其中 y 是 F(x) 中的元素。
为简单起见,假定图中不存在环,元素个数为 n,其中最长的一条路径也不超过 n。那么对于前面我们分析的减法游戏,其中 S = {1, 2, 3}。假定游戏中指定对 n 进行减法操作。X = {0, 1, 2…, n} 是图顶点。F(0) 是空集。F(1) = {0},F(2) = {0, 1}。 对于 2<= k <= n,F(k) = {k -3, k -2, k -1}。
因此这个游戏的图大致如下。其中 n = 10。
边的方向代表了可能的移动。
SG 函数
这种图可以通过分析 SG 函数来分析。
所谓图 (X, F) 的 SG 函数 g 是定义在 X 上的一个函数。
g(x) = min{n ≥ 0 : n ≠ g(y) for y ∈ F(x)}。换句话说,g(x) :是一个非负整数;尽可能的小;不出现在 x 的后缀节点的 g 函数取值中。
这是一个递归定义。但可以通过倒推来取得节点的值。对于终点 x,g(x) = 0,因为 F(x) 是空集。
如果一个态势的 g(x) = 0 那么它就是 P 态,否则就是 N 态。
下面的图描述了 g 函数的求解过程,在开始所有的顶点本是没有数字的。在开始,所有的终点 SG 函数值为 0,一共有 4 个终点,它们位于图的左边和下边。对于点 a,它的后缀 SG 函数为 0,那么它自身的 SG 值就是 1,它是所有没有出现在 a 后缀节点的 SG 值的最小值。那么 b 的 SG 值就是 2,因为它有 2 个后缀,一个是 a,令一个是终点,它们的 SG 值分别是 1 和 0,那么它的 SG 值就是 2。那么 c 的 SG 值就是 0,因为 c 只有一个后缀 a,而 a 的 SG 值为 1,那么没有出现在 c 后缀节点的 SG 值的最小值就是 0。
对于 S = {1, 2, 3} 的减法游戏其 SG 函数是多少?
终点 0, SG 值为 0, 1 只能移到 0,而 g(0) = 0,所以 g(1) = 1,同样,2 可以移动到 0 和 1,而 g(0) = 0,g(1) = 1,故 g(2) = 2,3 可以移动到 0,1,2 ,它们各自的 g(0) = 0, g(1) = 1, g(2) = 2,因此 g(3) = 3,但是对于 4 只能移动到 1,2,3,其各自的 SG 值为 1,2,3,故 g(4) = 0。
容易发现 g(x) = x( mod 4)。
考虑一种移石子游戏:每次必须移走至少剩余的一半,我们可以如下计算 SG 函数:
x 0 1 2 3 4 5 6 7 8 9 10 11 12 . . . g(x) 0 1 2 2 3 3 3 3 4 4 4 4 4 . . .
g(x) = min{k: power(2,k) > x}。
组合游戏之和
SG 函数有什么用?
假定我们有 n 个游戏图,G1 = (X1, F1),G2 = (X2, F2), . . . ,Gn = (Xn, Fn)。可以将它们结合成一个新图,G = (X,F)。X = X1×· · ·×Xn 笛卡尔乘积。X 是个 n 元组 (x1, . . . , xn),对于 i,xi ∈ Xi。对于 x = (x1, . . . , xn) ∈ X,它的 F(x) 定义为
F(x) = F(x1, . . . , xn) = F1(x1) × {x2}×· · ·×{xn}
∪ {x1} × F2(x2)×· · ·×{xn}
∪ · · ·
∪ {x1} × {x2}×· · ·×Fn(xn).
一个自 x=(x1, . . . , xn) 开始的一次移动在于只移动 xi 到其一个后继(位于 Fi(xi) 中的节点)。
对于组合图 G,其 SG 函数为各子图 SG 函数异或。
减法游戏之和
假定 G(m) 代表一堆情况下的减法游戏,其Sm = {1, 2, …, m},表示每次可以移走 1 到 m 个石子,其 SG 函数 gm(x) = x (mod (m + 1))。
0 <= gm(x) <= m。考虑 3 个减法游戏之和。在第一个游戏中,第一堆 m = 3,有 9 个石子,第二堆 m = 5,有 10 个石子,在第三堆中 m = 7 有 14 个石子,因此初始状态为(9,10,14)。此时的 SG 函数 g(9, 10, 14) = g3(9) xor g5(10) xor g7(14) = 1 xor 4 xor 6 = 3。此时可以在第三堆中拿走一个石子,此时的 SG 函数 g(9, 10, 13) = 1 xor 4 xor 5 = 0,这样你就给对手留下了一个 P 态。
要么全部,否则偶数
考虑一种移石子游戏:你可以移动任意个数的偶数个石子,只要它不是整堆;或者数量为奇数时拿走整堆。这个问题有两种终结状态:0 和 2。
g(2k) = k − 1,g(2k − 1) = k (k ≥ 1)。
如果当前游戏有 3 堆,数量分别是 10,13,20。它们各自的 SG 值分别是 g(10) = 4, g(13) = 7, g(20) = 9,三者异或是 10 不是 0,因此这是 N 态,你可以将 20 对应堆的 SG 值改为 3:从 20 堆中拿走 12 个即可。因为这堆的 g(8) = 3。
堆的分拆
现在对 Nim 博弈进行改下,除了像通常的 Nim 堆那样移动,还可以将一堆拆成 2 堆(不用移动)。显然一堆情况下的 SG 函数满足 g(0) = 0,g(1) = 1,对于 2 有几种状态,为 0,为 1 或者分拆成(1,1)。各自的 SG 值是 0,1,1 xor 1 = 0,因此 g(2) = 2。对于 3,后继是 0,1,2 和 (1,2),其 SG 值分别是 0,1,2 和 1 xor 2 = 3,因此 g(3) = 4。继续下去,可以发现
x 0 1 2 3 4 5 6 7 8 9 10 11 12 . . . g(x) 0 1 2 4 3 5 6 8 7 9 10 12 11 . . .
g(4k + 1) = 4k + 1,g(4k + 2) = 4k + 2,g(4k + 3) = 4k + 4,g(4k + 4) = 4k + 3。
硬币翻转
硬币翻转是组合的典型例子。
资料整理来自博客:www.chenyajun.com
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/183371.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...