<< 返回本书主页
<< Back to the afterword page

4 博弈论基础概念

吕汶桧 Wenhui Lyu

Jan. 2022

codes

4.1 背景问题

博弈问题作为理论抽象

博弈论是社会科学经典理论,同图论一样,博弈论可以用于对现实世界的一类现象进行抽象。

李老师先从最经典的“囚徒困境”讲起。两疑犯被警察抓住,分开关押。警察怀疑他们和一抢劫案有关,但没充足的证据。然而,他们都拒捕的事实也是可判刑的。开始审问,两疑犯被分别告知以下后果:

同时也告知:另一方也正在被告知这样的后果及你也知道这些。

两个囚徒之间的博弈可以由以下的收益矩阵表示:

囚徒1
抵赖 坦白
囚徒2 抵赖 -1, -1 -10, 0
坦白 0, -10 -4, -4

这里的要点是,每个人的收益不仅受自己的选择影响,而且受对方的选择影响。收益矩阵的不同赋值(关键是不同选择的收益的序数),决定了博弈的结果。

除了囚徒困境以外,博弈有多种类型。按照收益矩阵的不同赋值,博弈还有协调博弈和零和博弈(定义在此处略过),等等。除了两个参与者之间的博弈,博弈还可能在多个人之间发生。例如,在拍卖活动中,我的收益也取决于别人的出价。

总而言之,博弈有以下三个要素:

对于任意一个博弈,我们关心:

博弈问题的求解

求解博弈问题有多种方法。一种普遍的关注是找出博弈的均衡:对每个参与人而言,单方面更换策略已不能更好。根据纳什的研究,任何有穷博弈都至少有一个均衡,它有可能是纯策略均衡,也有可能是混合策略均衡(以给定的概率分别采取多种策略)。

要进行简单博弈推理,我们首先有以下几个理论假设:

  1. 个人收益是参与人关注的唯一对象。
  2. 参与人都是利己理性的(rational):追求自己的收益最大化(尽量大)——给定其他人的策略,若自己能通过改变当前策略获得更大收益,则不会采用当前策略。
  3. 每个参与人都对博弈结构(收益矩阵)有充分了解,即信息完整。
  4. 每个参与人都知道其他参与人也了解上述要点——共有知识(common knowledge)。

在前面囚徒困境的例子中,

囚徒1
抵赖 坦白
囚徒2 抵赖 -1, -1 -10, 0
坦白 0, -10 -4, -4

尽管两者都抵赖总福利最大(1,1),但是,每个人都有动机在别人抵赖时坦白,从而获得更大的收益0,也担心对方这样做。给定对方的选择(不管是“抵赖”还是“坦白”),自己都是选“坦白”更好,也就是说,“坦白”是双方各自的“严格占优策略”。因此,这个博弈会在4,4达到均衡。

除了双方都有严格占优策略的情况之外,达成均衡有多种方式。李老师在课上给我们举了几个例子,我们还做了几个求解练习。由于这些内容与本节课的计算作业关系不大,故仅列举在此。

4.2 计算实践:多人重复囚徒困境(IPD)博弈循环赛

codes

4.2.1 作业描述与算法思路

为了研究重复囚徒困境问题,假设招募了全班共m个人参加重复博弈,采用循环赛制,即一共有m(m1)2场博弈;每场n(无穷,很大,事先不确定)轮。

我们被告知博弈矩阵(如下图)以及参加的总人数,还被告知,比赛采用串行方式,即两个人把n轮做完,再换两人。

玩家k
合作C 背叛D
玩家j 合作C 3, 3 0, 5
背叛D 5, 0 1, 1

我们要以一个函数的方式提供自己的策略。该函数的输入是自己和对手到当前为止已给出的行为(策略的一部分),返回自己下一次的行为。总得分是我参与的所有博弈(n(m1)次)的得分之和。

每个人给出自己的策略函数后,我们还需要写程序模拟一个循环赛程序(调用那些函数),试用不同的n,分别算出每个人的总分,并进行讨论。

为了设计出得分高的策略,我的函数要分析自己和对手到当前为止已给出的行为,预测对方的下一次行为。给出自己的反应时,我们还要考虑到,自己如此行动会成为此后博弈的已知信息,这会不会影响未来的合作?总之,我们需要预测对方的行动,做出最有利于多次博弈总收益的回应。最好是能猜出对方的策略函数。比如说,“一报还一报”策略可能被很多人采纳,那么我可以在我的策略函数中设置一些判断条件。如果对方真的采用“一报还一报”策略,最有利于我的策略就是永远选择合作。模拟循环赛的程序并不难,只有判断最佳应答策略时程序稍微有些复杂,具体的算法见后。

4.2.2 编程实现与要点说明

策略函数

每个人的策略函数,输入自己到当前为止已给出的行为me和对手到当前为止已给出的行为him,返回下一次的行为合作C或背叛D

一个最典型的策略函数是“一报还一报”。如果对方上一次选择合作,亦即if him[i-1]=='C',我这一次就选择合作'C';否则就选择背叛。

老师提供了一个devil策略。如果对方上一次选择合作,devil就选择背叛;对方上一次背叛,devil就合作。

我的策略函数则稍微复杂一些。我在函数里加入了一些判断条件,试图预测对方的策略,从而给出自己的反应。

前四次我都选择合作,从而获取对方的四次反应数据。

接着,我开始预测对方的策略函数。

如果对方第三次以后总是选择合作,我就认为ta采取的是“天真策略”('innocent')。当然,我前四次都选择合作,对方也选择合作很正常,这个判断条件会让我第五次选择背叛。但这只会损害我在一轮里的收益,这是获取对方反应数据的必要成本。如果我第五次选择了背叛,对方仍然不选择背叛,认为对方采取的是“天真策略”('innocent')就比较合理了。

接着,我开始验证对方是否采取了“一报还一报”策略。关键在于分析对方采取合作时的情景:对方为什么愿意信任我,选择合作?

如果我无法判断对方的策略,保险起见,我选择背叛。

如果我判断对方的策略是报复策略(不论是长时还是短时),我都选择合作,以期ta下回也会和我合作。

博弈循环赛

11位同学和devil的策略函数集合在strategy.py里,先跨文件调用:

首先定义一个函数game_dual。给定两个玩家,模拟二者之间的多轮重复博弈,按照收益矩阵计算两个人各自的分数。

定义函数game,以便改变循环赛设定(轮数n和有无devil)时多次调用。让所有玩家两两进行博弈,把每一组的结果存储在score_dict里。例如,ij博弈的结果就是score_dict[i][j]

首先,统一计算所有玩家相互博弈后的总分数(存储在scores里),输出结果。

接着,为了分析最佳应答策略,我分析比赛结果score_dict,把每个人从i处赚得的分数存储在score_individual[i]里。

i处赚得最多分数的人,具有最佳应答策略。

考虑有多个最佳应答策略的情况,他们从i赚得的分数一样。

考虑不存在最佳应答策略的情况,删除用来占空的[0,0]

输出分析结果

非严格占优策略dominant对于所有玩家都是最佳占优策略。

两个人互相是对方的最佳占优策略,也值得分析。

为了方便重复调用,以上分析都被包含在game函数中。game函数最后返回score_dict

以下是主程序。循环次数不同时、有无devil时,计算比赛的不同结果。

4.2.3 结果与分析

n=1000, devil=True时,输出结果如下:

1234567891011devil
691006891869136755457192868622691366912969136613666869527003

我的策略函数(编号10)的分数并不好,在p4与devil面前失分最多。

对于p4和devil以外的策略,我丢分的原因在于,我设置的“一报还一报”的比例门槛是0.9,这就意味着,当别人并没有完全按照一报还一报的策略进行时,我仍然在选择合作,这损伤了我的分数。

<< 返回本书主页
<< Back to the afterword page