Nashpy包学习(一)

Nashpy包应用


建立一个博弈并找出博弈的纳什均衡

官方文档传送

用例:石头剪刀布
1. 基本内容

这是一个典型的博弈过程,每个 p l a y e r player player都有三个选择(在博弈论中称之为 s t r a t e g i e s strategies strategies):

  • 石头
  • 剪刀

胜利者的胜利条件为:

  • 石头粉碎剪刀
  • 布包住石头
  • 剪刀剪切布

据此构建收益矩阵 A i j A_{ij} Aij
A = ( 0 − 1 1 1 0 − 1 − 1 1 0 ) A=\begin{pmatrix} 0 & -1 & 1\\ 1 & 0 & -1\\-1 & 1 & 0\end{pmatrix} A=011101110
矩阵A为控制行的玩家当他采取第 i i i 行并且他们的对手(列玩家)玩第 j j j 列时的效用。

2. 构建博弈

可以根据行玩家的效用矩阵来构建博弈:

import nashpy as nash
import numpy as np
A = np.array([[0,-1,1],[1,0,-1],[-1,1,0]])
rps = nash.Game(A)
rps

输出:

可知行玩家和列玩家之间为零和博弈,因此列玩家的效用矩阵应该与列玩家正好相反,此时也可以使用行玩家和列玩家的效用矩阵来一起构建博弈。

import nashpy as nash
import numpy as np
A = np.array([[0,-1,1],[1,0,-1],[-1,1,0]])
B = -A
rps = nash.Game(A,B)
rps

在这里插入图片描述

3. 计算一对策略的效用

将两个 p l a y e r player player定义为行玩家( r r r)和列玩家( c c c)

数学方法表示策略为一个固定长度的向量,长度为行为个数,例如:
σ r = ( 0 , 0 , 1 ) \boldsymbol\sigma_r=(0,0,1) σr=(0,0,1)表示 r r r的策略为一直出剪刀;
σ c = ( 0 , 1 , 0 ) \boldsymbol\sigma_c=(0,1,0) σc=(0,1,0)表示 c c c一直出布。

当双方策略固定后,使用线性代数表达式获得玩家的效用:
{ U r ( σ r ) = σ r A σ c T U c ( σ c ) = σ r B σ c T \begin{cases}U_r(\boldsymbol\sigma_r)=\boldsymbol\sigma_rA\boldsymbol\sigma_c^T\\U_c(\boldsymbol\sigma_c)=\boldsymbol\sigma_rB\boldsymbol\sigma_c^T\end{cases} {Ur(σr)=σrAσcTUc(σc)=σrBσcT
使用Nashpy计算收益:

sigma_r = [0,0,1]
sigma_c = [0,1,0]
rps[sigma_r,sigma_c]

在这里插入图片描述

上述假定策略固定,我们还可以使策略随机,此时效用对应的是长期平均值,这就是我们对策略和效用计算的表示变得特别有用的地方:

σ r = ( 1 / 2 , 1 / 2 , 0 ) \boldsymbol\sigma_r=(1/2,1/2,0) σr=(1/2,1/2,0)表示 r r r以1/2概率出石头,1/2概率出布;
σ c = ( 0 , 1 / 2 , 1 / 2 ) \boldsymbol\sigma_c=(0,1/2,1/2) σc=(0,1/2,1/2)表示 c c c以1/2概率出布,1/2概率出剪刀。

sigma_r = [1/2,1/2,1]
sigma_c = [0,1/2,1/2]
rps[sigma_r,sigma_c]

在这里插入图片描述
此时列玩家可能会在下一阶段偏离。

4. 计算纳什均衡

纳什均衡是一组策略,在这个策略下,双方玩家都不会有意图去改变策略,我们可以使用Nashpy来找纳什均衡:

eqs = rps.support_enumeration()
list(eqs)

在这里插入图片描述

5. Learning in game

在非合作博弈中,纳什均衡并不是容易观测到的。纳什均衡对应于没有玩家有改变策略的动机,但这并不一定意味着玩家可以自然地达到平衡状态。

import numpy as np
iterations = 100
np.random.seed(0)
play_counts = rps.fictitious_play(iterations=iterations)
for row_play_count,colum_play_count in play_counts:
    print(row_play_count,colum_play_count)

在这里插入图片描述
在这里插入图片描述
随着时间的推移,我们可以看到行为的出现,可以将游戏计数***归一化以给出策略向量***。 注意,这些并不总是收敛。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值