Python中的博弈论（Game Theory）应用：多智能体间的纳什均衡搜索

admin
Thu, 27 Nov 2025 11:09:06 +0000
Python, game, python, theory

Python在博弈论中的应用：多智能体间的纳什均衡搜索 大家好，今天我们将深入探讨博弈论及其在Python中的应用，重点关注如何在多智能体环境中寻找纳什均衡。博弈论是一个研究理性个体在策略互动中做出决策的数学框架，它在经济学、政治学、计算机科学等领域都有着广泛的应用。而Python作为一种强大的编程语言，提供了丰富的工具和库，使得我们可以方便地构建博弈模型并进行求解。 1. 博弈论基础概念回顾 在深入代码之前，我们需要回顾一些博弈论的基本概念： 博弈 (Game): 描述多个参与者（智能体）之间相互作用的数学模型。 参与者 (Player): 博弈中的决策者，也称为智能体。 策略 (Strategy): 参与者在博弈中可以采取的行动方案。 策略组合 (Strategy Profile): 所有参与者选择的策略的集合。 收益 (Payoff): 参与者在特定策略组合下获得的效用或奖励。 纳什均衡 (Nash Equilibrium): 一种策略组合，其中任何参与者都无法通过单方面改变策略来提高自己的收益，即在给定其他参与者的策略下，每个参与者的策略都是最优的。 2. 博弈的表示方法 在P …

继续阅读“Python中的博弈论（Game Theory）应用：多智能体间的纳什均衡搜索”

The post Python中的博弈论（Game Theory）应用：多智能体间的纳什均衡搜索 first appeared on 智猿学院-前后端，数据库，人工智能，云计算等领域前沿技术讲座.

Python在博弈论中的应用：多智能体间的纳什均衡搜索

大家好，今天我们将深入探讨博弈论及其在Python中的应用，重点关注如何在多智能体环境中寻找纳什均衡。博弈论是一个研究理性个体在策略互动中做出决策的数学框架，它在经济学、政治学、计算机科学等领域都有着广泛的应用。而Python作为一种强大的编程语言，提供了丰富的工具和库，使得我们可以方便地构建博弈模型并进行求解。

1. 博弈论基础概念回顾

在深入代码之前，我们需要回顾一些博弈论的基本概念：

博弈 (Game): 描述多个参与者（智能体）之间相互作用的数学模型。

参与者 (Player): 博弈中的决策者，也称为智能体。

策略 (Strategy): 参与者在博弈中可以采取的行动方案。

策略组合 (Strategy Profile): 所有参与者选择的策略的集合。

收益 (Payoff): 参与者在特定策略组合下获得的效用或奖励。

纳什均衡 (Nash Equilibrium): 一种策略组合，其中任何参与者都无法通过单方面改变策略来提高自己的收益，即在给定其他参与者的策略下，每个参与者的策略都是最优的。

2. 博弈的表示方法

在Python中，我们可以使用不同的方式来表示博弈。最常见的两种方式是：

收益矩阵 (Payoff Matrix): 适用于参与者数量较少、策略集合有限的博弈。收益矩阵描述了每个参与者在不同策略组合下的收益。

函数形式 (Function Form): 适用于策略集合可以是连续的或更复杂的博弈。收益通过函数来计算，输入是所有参与者的策略。

3. 使用Python构建博弈模型

让我们通过几个例子来演示如何在Python中构建博弈模型。

3.1 囚徒困境 (Prisoner’s Dilemma)

囚徒困境是一个经典的博弈论例子，描述了两个囚犯在面临指控时，选择合作或背叛的策略。

import numpy as np

# 收益矩阵，行代表囚徒1，列代表囚徒2
# C代表合作，D代表背叛
payoff_matrix = {
    ('C', 'C'): (-1, -1),  # 都合作，都判1年
    ('C', 'D'): (-3, 0),   # 囚徒1合作，囚徒2背叛，囚徒1判3年，囚徒2释放
    ('D', 'C'): (0, -3),   # 囚徒1背叛，囚徒2合作，囚徒1释放，囚徒2判3年
    ('D', 'D'): (-2, -2)   # 都背叛，都判2年
}

def prisoner_dilemma(player1_strategy, player2_strategy):
    """
    囚徒困境博弈的收益函数。

    Args:
        player1_strategy: 囚徒1的策略 ('C' 或 'D')
        player2_strategy: 囚徒2的策略 ('C' 或 'D')

    Returns:
        一个元组，包含囚徒1和囚徒2的收益。
    """
    return payoff_matrix[(player1_strategy, player2_strategy)]

# 示例：计算如果囚徒1合作，囚徒2背叛的收益
payoffs = prisoner_dilemma('C', 'D')
print(f"囚徒1合作，囚徒2背叛的收益：{payoffs}") # 输出: 囚徒1合作，囚徒2背叛的收益：(-3, 0)

3.2 古诺竞争 (Cournot Competition)

古诺竞争描述了两个公司生产同质产品，并同时决定产量的博弈。市场价格取决于总产量。

def cournot_competition(q1, q2, a=100, c=10):
    """
    古诺竞争博弈的收益函数。

    Args:
        q1: 公司1的产量
        q2: 公司2的产量
        a: 市场需求截距
        c: 生产成本

    Returns:
        一个元组，包含公司1和公司2的收益。
    """
    Q = q1 + q2  # 总产量
    P = max(0, a - Q)  # 市场价格，如果总产量超过需求，价格为0
    profit1 = (P - c) * q1  # 公司1的利润
    profit2 = (P - c) * q2  # 公司2的利润
    return profit1, profit2

# 示例：计算如果公司1产量为20，公司2产量为30的收益
profits = cournot_competition(20, 30)
print(f"公司1产量为20，公司2产量为30的收益：{profits}") # 输出：公司1产量为20，公司2产量为30的收益：(1400, 2100)

4. 纳什均衡搜索算法

找到纳什均衡是博弈论中的一个核心问题。针对不同的博弈类型，我们可以采用不同的算法。

4.1 纯策略纳什均衡

对于策略集合有限的博弈，我们可以通过遍历所有可能的策略组合来寻找纯策略纳什均衡。

def find_pure_nash_equilibrium(game, strategies):
    """
    寻找纯策略纳什均衡。

    Args:
        game: 博弈的收益函数，接受一个策略组合作为输入，返回一个收益元组。
        strategies: 一个字典，包含每个参与者的策略集合。例如：{'player1': ['C', 'D'], 'player2': ['C', 'D']}

    Returns:
        一个列表，包含所有纯策略纳什均衡。
    """
    nash_equilibria = []
    players = list(strategies.keys())  # 获取所有参与者
    num_players = len(players)

    # 生成所有可能的策略组合
    import itertools
    strategy_combinations = itertools.product(*strategies.values())

    for combination in strategy_combinations:
        # 将策略组合转换成字典形式，方便调用收益函数
        strategy_profile = dict(zip(players, combination))
        payoffs = game(**strategy_profile)

        # 检查是否为纳什均衡
        is_nash = True
        for i, player in enumerate(players):
            original_payoff = payoffs[i]
            original_strategy = strategy_profile[player]

            # 尝试改变当前参与者的策略
            for alternative_strategy in strategies[player]:
                if alternative_strategy != original_strategy:
                    new_strategy_profile = strategy_profile.copy()
                    new_strategy_profile[player] = alternative_strategy
                    new_payoffs = game(**new_strategy_profile)
                    if new_payoffs[i] > original_payoff:
                        # 存在更优策略，不是纳什均衡
                        is_nash = False
                        break

            if not is_nash:
                break

        if is_nash:
            nash_equilibria.append(strategy_profile)

    return nash_equilibria

# 应用到囚徒困境
strategies = {'player1': ['C', 'D'], 'player2': ['C', 'D']}
nash_equilibria = find_pure_nash_equilibrium(prisoner_dilemma, strategies)
print(f"囚徒困境的纯策略纳什均衡：{nash_equilibria}") # 输出: 囚徒困境的纯策略纳什均衡：[{'player1': 'D', 'player2': 'D'}]

4.2 混合策略纳什均衡

当不存在纯策略纳什均衡时，我们需要寻找混合策略纳什均衡。混合策略是指参与者以一定的概率分布随机选择策略。寻找混合策略纳什均衡通常需要更复杂的数学方法，例如求解方程组或使用优化算法。

4.2.1 求解方程组

对于简单的2×2博弈，我们可以通过求解方程组来找到混合策略纳什均衡。

以猜硬币正反面为例，两个参与者同时选择正面或反面。如果选择相同，参与者1获胜；如果选择不同，参与者2获胜。

import sympy
from sympy import symbols, solve

def matching_pennies():
  """
  猜硬币正反面博弈的收益函数。
  """
  payoff_matrix = {
      ('H', 'H'): (1, -1),  # 都选正面
      ('H', 'T'): (-1, 1),  # 参与者1选正面，参与者2选反面
      ('T', 'H'): (-1, 1),  # 参与者1选反面，参与者2选正面
      ('T', 'T'): (1, -1)   # 都选反面
  }

  def game(player1_strategy, player2_strategy):
    return payoff_matrix[(player1_strategy, player2_strategy)]

  return game

def find_mixed_nash_equilibrium_2x2(game, strategies):
    """
    寻找2x2博弈的混合策略纳什均衡。

    Args:
        game: 博弈的收益函数
        strategies: 策略集合

    Returns:
        一个元组，包含两个参与者的混合策略概率。
    """
    # 定义符号变量
    p = symbols('p')  # 参与者1选择第一个策略的概率
    q = symbols('q')  # 参与者2选择第一个策略的概率

    # 构建方程组
    # 参与者1的期望收益在参与者2的混合策略下，选择两个策略的期望收益相等
    # 参与者2的期望收益在参与者1的混合策略下，选择两个策略的期望收益相等

    s11 = strategies['player1'][0]
    s12 = strategies['player1'][1]
    s21 = strategies['player2'][0]
    s22 = strategies['player2'][1]

    # 参与者1的期望收益：
    # E[s11] = q * game(s11, s21)[0] + (1-q) * game(s11, s22)[0]
    # E[s12] = q * game(s12, s21)[0] + (1-q) * game(s12, s22)[0]
    # E[s11] = E[s12]

    # 参与者2的期望收益：
    # E[s21] = p * game(s11, s21)[1] + (1-p) * game(s12, s21)[1]
    # E[s22] = p * game(s11, s22)[1] + (1-p) * game(s12, s22)[1]
    # E[s21] = E[s22]

    game_func = game()
    eq1 = q * game_func(s11, s21)[0] + (1-q) * game_func(s11, s22)[0] - (q * game_func(s12, s21)[0] + (1-q) * game_func(s12, s22)[0])
    eq2 = p * game_func(s11, s21)[1] + (1-p) * game_func(s12, s21)[1] - (p * game_func(s11, s22)[1] + (1-p) * game_func(s12, s22)[1])

    # 求解方程组
    solutions = solve((eq1, eq2), (p, q))

    # 验证解的有效性 (概率需要在0和1之间)
    if solutions:
        p_val, q_val = solutions[0]
        if 0 <= p_val <= 1 and 0 <= q_val <= 1:
            return p_val, q_val
        else:
            return None # 解无效
    else:
        return None  # 无解

# 应用到猜硬币正反面博弈
strategies = {'player1': ['H', 'T'], 'player2': ['H', 'T']}
equilibrium = find_mixed_nash_equilibrium_2x2(matching_pennies, strategies)

if equilibrium:
    print(f"猜硬币正反面博弈的混合策略纳什均衡：参与者1选择正面的概率为{equilibrium[0]}，参与者2选择正面的概率为{equilibrium[1]}") # 输出: 猜硬币正反面博弈的混合策略纳什均衡：参与者1选择正面的概率为1/2，参与者2选择正面的概率为1/2
else:
    print("未找到混合策略纳什均衡")

4.2.2 使用优化算法

对于更复杂的博弈，我们可以使用优化算法来近似求解混合策略纳什均衡。常见的优化算法包括：

梯度下降 (Gradient Descent): 通过迭代更新策略，朝着收益增加的方向移动。

进化算法 (Evolutionary Algorithms): 例如遗传算法，通过模拟自然选择的过程来优化策略。

这里我们使用梯度下降来近似求解古诺竞争的纳什均衡。

import numpy as np

def gradient_descent_cournot(a=100, c=10, learning_rate=0.01, iterations=1000):
    """
    使用梯度下降算法近似求解古诺竞争的纳什均衡。

    Args:
        a: 市场需求截距
        c: 生产成本
        learning_rate: 学习率
        iterations: 迭代次数

    Returns:
        一个元组，包含公司1和公司2的近似最优产量。
    """
    q1 = 5.0  # 初始产量
    q2 = 5.0

    for i in range(iterations):
        # 计算利润
        profit1, profit2 = cournot_competition(q1, q2, a, c)

        # 计算利润对产量的导数 (梯度)
        Q = q1 + q2
        P = max(0, a - Q)

        # d(profit1)/dq1 = P - c - q1
        # d(profit2)/dq2 = P - c - q2
        grad_q1 = P - c - q1 if P > 0 else -q1 - c
        grad_q2 = P - c - q2 if P > 0 else -q2 - c

        # 更新产量
        q1 += learning_rate * grad_q1
        q2 += learning_rate * grad_q2

        # 保证产量非负
        q1 = max(0, q1)
        q2 = max(0, q2)

    return q1, q2

# 使用梯度下降算法
q1_optimal, q2_optimal = gradient_descent_cournot()
print(f"古诺竞争的近似纳什均衡：公司1的产量为{q1_optimal}，公司2的产量为{q2_optimal}")
# 期望输出: 古诺竞争的近似纳什均衡：公司1的产量为29.999999999999996，公司2的产量为29.999999999999996

5. 一些高级应用和库

Nashpy: 一个专门用于计算双矩阵博弈纳什均衡的Python库，使用Lemke-Howson算法。

OpenSpiel: 谷歌开发的用于强化学习和博弈论研究的框架，支持多种博弈类型和算法。

多智能体强化学习 (Multi-Agent Reinforcement Learning, MARL): 将强化学习应用于多智能体环境，通过学习来寻找纳什均衡或合作策略。

演化博弈论 (Evolutionary Game Theory): 研究策略在群体中的演化过程，例如复制者动态 (Replicator Dynamics)。

6. 总结

概念 | 描述
博弈 | 多智能体交互的数学模型
纳什均衡 | 一种策略组合，任何参与者都无法通过单方面改变策略来提高自己的收益
纯策略纳什均衡 | 参与者选择确定性策略的纳什均衡
混合策略纳什均衡 | 参与者以一定的概率分布随机选择策略的纳什均衡

代码示例总结

展示了如何用收益矩阵和函数形式表示博弈。

实现了纯策略纳什均衡的搜索算法。

实现了2×2博弈混合策略纳什均衡的求解方程组方法。

演示了如何使用梯度下降算法近似求解古诺竞争的纳什均衡。

博弈论在Python中的应用概括

通过Python可以方便地构建博弈模型，并使用各种算法来寻找纳什均衡，从而分析智能体之间的策略互动，并为决策提供支持。

更多IT精英技术系列讲座，到智猿学院