双人矩阵博弈中的纳什均衡

目录

双人矩阵博弈

双人零和矩阵博弈中的线性规划

线性规划

线性规划举例 -- 猜硬币

猜硬币纳什均衡代码 


双人矩阵博弈

  1. 对于双人矩阵博弈,可建立一个由包含各个联合行为对回报的元素所构成的矩阵。由此,玩家i(i=1,2)的回报函数Ri可表示为一个矩阵。
  2. 如果两个玩家完全竞争,则该双人矩阵博弈称为零和博弈。在这种情况下,R1 =-R2。在期望回报上,零和博弈只有唯一的纳什均衡。这意味着,尽管在零和博弈中每个玩家可能具有多种纳什均衡策略,但在这些纳什均衡策略下,期望回报值V均相同。
  3. 一般和矩阵博弈是指各种类型的矩阵博弈。在一般和矩阵博弈中,纳什均衡不再唯一,可能具有多个纳什均衡。
  4. 在双人矩阵博弈中,定义玩家 i 行为集Ai(i =1,2)的所有概率分布集合为\pi _{i}=(\pi _{i}(a_{1}),...,\pi _{i}(a_{m_{i}})),由此,Vi可为V_{i}=\pi _{1}R_{i}\pi_{2}^{T}(因为Ri要靠执行对应的动作才能获得,因此两边乘上对应策略的概率,便是当前情况下的Vi)
  5. 双人矩阵博弈的纳什均衡是指对于两个玩家的策略对(\pi _{1}^{*},\pi _{2}^{*}),i=1,2,具有V_{i}(\pi _{i}^{*},\pi _{-i}^{*})\geqslant V_{i}(\pi _{i},\pi _{-i}^{*}),\forall \pi _{i}\in PD(A_{i}),式中,-i是指玩家i以外的其他玩家;PD(Ai)为玩家i的行为集Ai的所有概率分布集合。这个公式的含义是,固定除i以外的其他玩家的策略,玩家i采取最优策略的V值,比采取其他策略的V值要大。
  6. 假定每个玩家在游戏中只有两种行为,则双人-双行为的一般和矩阵博弈可以定义如下:R_{1}=\begin{bmatrix} r11&r12&\\r21&r22\end{bmatrix},R_{2}=\begin{bmatrix} c11&c12&\\c21&c22 \end{bmatrix},式中,r_{lf}>r_{-lf},c_{lf}>c_{l-f},其中l,f\in {1,2},式中,-l和-f分别表示除行l之外的其他行和除列f之外的其他列。

双人零和矩阵博弈中的线性规划

线性规划

  1. 求解双人零和矩阵博弈中的纳什均衡等价于寻找下列方程的最小解\max_{\pi _{i}\in PD(A_{i})}\min_{a _{-i}\in A_{i}}\sum_{a_{i}\in A_{i}} R_{i}\pi _{i}(a_{i})\pi _{i}(a_{i})是指玩家 i 的行为a_{i}的概率分布,a_{-i}表示除玩家i以外的其他玩家的所有行为,根据上式,每个玩家都试图在与对手对抗的最坏情况下得到最大化回报。为求解上式,可采用线性规划方法。

  2. 假设给定一个2x2的零和矩阵博弈如下:

    式中,R1为玩家1的回报矩阵,R2为玩家2的回报矩阵。
  3. 定义pj(j=1,2)为玩家1第j个行为的概率分布,而qj为玩家2第j个行为的概率分布。
  4. 由此,玩家1的线性规划问题可表示为寻找(p1,p2)以使得V1最大化,且满足:

     玩家2的线性规划问题可表示为寻找(p1,p2)以使得V2最大化,且满足:

     为解决上述线性规划问题,可采用单纯形法来寻找几何最优点。

线性规划举例 -- 猜硬币

  • 猜硬币游戏中,玩家1的回报矩阵如下:

  • 由于 p2=1-p1,则玩家1的线性规划问题为:寻找p1使得V1最大化,且满足

  •  根据上述线性约束画图,如下:
  •  其中横轴为V1,纵轴为p1;图中灰色区域为V1区域(V1<=那两条线上的V1值);当p1=0.5时,V1最大,为0;则寻找到p1=0.5使得V1最大,那p2=1-0.5=0.5,那玩家1的纳什均衡为:(0.5,0.5)
  • 对玩家2做同样操作,也能得到,玩家2的纳什均衡也为(0.5,0.5)

猜硬币纳什均衡代码 

import numpy as np
def Nash_LP_Point(R:list):
    x = np.arange(0, 1.1, 0.1)
    line1 = {}
    line2 = {}
    point = []
    for i in x:
        i = round(i, 2)
        j = round(R[0][0] * i + R[1][0] * (1 - i), 2)
        line1[i] = j
    for i in x:
        i = round(i, 2)
        j = round(R[0][1] * i + R[1][1] * (1 - i), 2)
        line2[i] = j
    # print(line1)
    # print(line2)
    # print(f'line1两个端点:0:{line1[0]},1:{line1[1]}')
    # print(f'line2两个端点:0:{line2[0]},1:{line2[1]}')
    for i1 in x:
        for i2 in x:
            i1 = round(i1, 2)
            i2 = round(i2, 2)
            if i1 == i2:
                if line1[i1] == line2[i2]:
                    # print(f'交点:{i1, line1[i1]}')
                    point.append((i1, line1[i1]))
                    break

    e_point = {'10': line1[0], '11': line1[1], '20': line2[0], '21': line2[1]}
    e_point_sort = sorted(e_point.items(), key=lambda x: x[1], reverse=False)
    # print(e_point_sort)
    if e_point_sort[0][1] >= e_point_sort[1][1]:
        a = int(e_point_sort[0][0]) % 10
        b = e_point_sort[0][1]
        point.append((a, b))
    else:
        a = int(e_point_sort[1][0]) % 10
        b = e_point_sort[1][1]
        point.append((a, b))
    #print(point)
    point = sorted(point, key=lambda x: x[1], reverse=True)
    print(point[0])

R1=[[1,-1],[-1,1]]
Nash_LP_Point(R1)
R2=[[-1,1],[1,-1]]
Nash_LP_Point(R2)
R3=[[1,2],[-1,1]]
Nash_LP_Point(R3)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春有百花巨小蟹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值