📌  相关文章
📜  零和博弈(1)

📅  最后修改于: 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分。