📅  最后修改于: 2023-12-03 14:58:42.894000             🧑  作者: Mango
在博弈论中,零和博弈(zero-sum game)就是一个双方参与的博弈,其胜者和失败者所得到的效用值之和为零。换句话说,在零和博弈中,一方的收益等于另一方的损失。
举个例子,一个赌场上两个人在玩一个纸牌游戏。一开始,每个人筹码数量相等,且规定每局游戏输赢相加为0。如果你摸到了一个牌点数为5的牌,你就赢了5个筹码,而你的对手将损失5个筹码。相反的,如果你输了,你将损失5个筹码,而你的对手会得到5个筹码。游戏继续持续直到其中一个玩家失去所有的筹码。
对于一个零和博弈来说,纳什均衡(Nash Equilibrium)是一个非常重要的概念。纳什均衡是指,在博弈中,如果所有的参与者遵循纳什均衡策略,那么任何一方单独改变其策略都无法获得更高的收益。也就是说,当所有的参与者都在采用纳什均衡策略时,任何一方都无法通过单独采取行动来改进自己的收益。在下面的例子中,将学习用程序求解纳什均衡。
为了说明零和博弈,我们可以使用Python实现一个简单的例子,该例子是一个二人零和博弈。程序通过迭代的方式求解出该博弈的纳什均衡。
在本例中,两个玩家要么合作要么背叛,在进行若干轮的游戏,每次都是上次的玩家对手。在背叛的情况下,赢家得到5分而输家失去5分;在合作的情况下,两个玩家各得到2分。我们可以把该二人零和博弈表示为一个2×2的矩阵(横向表示玩家1的选择,纵向表示玩家2的选择):
| 背叛 | 合作
---- | ---- | ----
背叛 | 5, -5| 0, 0
合作 | -2, 2| 2, -2
下面是Python实现代码,具体注释已经添加到代码中:
import numpy as np
# 定义二人零和博弈的策略空间
strategies = ['collude', 'defect']
# 用matrix表示博弈过程
matrix = np.array([[2,-2],[-5,5]])
# 求解纳什均衡
def nash_equilibrium(A):
"""通过迭代算法求解博弈的纳什均衡"""
# 初始化变量
m, n = A.shape
expected_payoffs = np.zeros((m, n))
p = np.ones(m) / m
q = np.ones(n) / n
# 迭代求解
while True:
# 计算期望收益
expected_payoffs = A.dot(q).reshape(-1, 1) * p.reshape(1, -1)
# 更新策略
new_p = 1 / (A.T.dot(q) / expected_payoffs.sum(axis=0))
new_q = 1 / (A.dot(p) / expected_payoffs.sum(axis=1))
if np.allclose(new_p, p) and np.allclose(new_q, q):
# 如果策略未发生变化,停止迭代
p = new_p
q = new_q
break
# 更新策略并继续迭代
p = new_p
q = new_q
return p, q, np.dot(p, np.dot(A, q))
# 打印结果
print("玩家1采用{}策略,玩家2采用{}策略,期望收益为{}".format(strategies[np.argmax(nash_equilibrium(matrix)[0])],
strategies[np.argmax(nash_equilibrium(matrix)[1])], nash_equilibrium(matrix)[2]))
可以看到,该博弈的纳什均衡出现在玩家1选择背叛,玩家2选择合作的情况下。此时,两个玩家各得到2分。