求解Nash均衡的子集枚举算法
感觉查nash均衡只能查到经济学的东西,都是说2*2或者3*3的作业题怎么做的,很难找到一个解释通用算法的(给计算机专业的人看的)文章,所以专门记一下。
双矩阵博弈(bimatrix game)
双矩阵博弈由两个矩阵
nash均衡
玩家1的策略可以表示为一个向量x,x的长度和收益矩阵的行数相同,代表采取相应行动的概率。如果x中只有一个值为1其他都是0,那么称x为纯策略,否则为混合策略。玩家2的策略y定义类似。
给定收益矩阵
nash均衡的基本思想是,在其他玩家不改变策略的前提下,玩家改变自身策略不能增加自己的收益。
即若
囚徒困境就是一个典型的有纯策略nash均衡的双矩阵博弈。
可以证明
- 双矩阵博弈中纯策略nash均衡不一定存在
- 混合策略nash均衡一定存在
- nash均衡可能有一个,也可能有多个
Nash均衡的求解是一个困难的问题,这是现在查不到关于一般的nash均衡求解(而不是仅限于双矩阵博弈)方法的根本原因。目前还没有求解nash均衡的多项式时间算法,并且与nash均衡有关的几个问题已经被证明是np-hard的(比如判断当前问题是否有多于一个nash均衡)。
子集枚举算法(Support Enumeration)
基于nash均衡的定义可以导出一个使用子集枚举+线性规划的方法,就是Support Enumeration。
首先有以下结论:如果一个动作出现在混合策略nash均衡中,也就是采取这个动作的概率大于0,那么它应该与其他有用的动作无差别。所谓无差别是指,不能通过改变这个动作的概率影响收益。
假设已经知道存在nash均衡由S1和S2两个子集中的动作组成。
有以下约束
其中1约束了不在集合中的动作不能被选,2约束了概率的和必须为1,3约束了集合中的动作必须被选择(概率大于0)。
nash均衡中动作的无差别性决定了采取在集合中的动作应该有相同的期望收益(以下的U和V)(否则就有方法提高期望收益),同时不在集合中的动作不应该优于任何集合中的动作,这对应了以下约束。
最后需要优化的目标是最大化
而子集枚举算法就是首先枚举均衡策略的动作集合,然后采用以上方法检测是否可行,最终一定一个得到一个可行的结果。其复杂度为O(子集数量×线性规划复杂度)。参考文献中有一个该算法的实现。
参考
- nashpy包含了包括子集枚举法的几种算法实现。
- On Algorithms for Nash Equilibria包含几种算法的详细介绍和复杂度分析。