博弈论入门别死磕课本!用Python实战模拟‘智猪博弈’与‘囚徒困境’
博弈论实战用Python模拟智猪博弈与囚徒困境当教科书上的博弈论公式让你昏昏欲睡时不妨打开Python编辑器用代码亲手构建这些经典模型。本文将带你用不到100行代码实现两个最著名的博弈案例——智猪博弈和囚徒困境并通过可视化让你直观理解纳什均衡等核心概念。1. 环境准备与基础工具在开始前确保你的Python环境已安装以下库!pip install numpy matplotlib seaborn我们将使用这些工具构建博弈矩阵和可视化结果。创建一个新的Jupyter Notebook导入基础模块import numpy as np import matplotlib.pyplot as plt from itertools import product博弈论模型的核心是收益矩阵它定义了每个玩家在不同策略组合下的得失。我们可以用NumPy数组来表示# 示例2x2博弈矩阵 payoff_matrix np.array([ [[3,3], [0,5]], # 玩家A的策略1 [[5,0], [1,1]] # 玩家A的策略2 ])2. 囚徒困境的Python实现让我们先实现最经典的囚徒困境模型。两个囚徒各自有合作和背叛两种选择def prisoner_dilemma(): # 定义收益矩阵 (玩家A, 玩家B) payoff { (合作,合作): (-1, -1), (合作,背叛): (-3, 0), (背叛,合作): (0, -3), (背叛,背叛): (-2, -2) } strategies [合作, 背叛] return payoff, strategies我们可以用热力图直观展示这个博弈def plot_payoff(payoff, strategies): matrix np.array([[payoff[(i,j)] for j in strategies] for i in strategies]) plt.figure(figsize(8,6)) plt.imshow(matrix[:,:,0], cmapRdYlGn) # 玩家A的收益 plt.colorbar(label玩家A收益) plt.xticks([0,1], strategies) plt.yticks([0,1], strategies) plt.xlabel(玩家B策略) plt.ylabel(玩家A策略) # 标注具体数值 for i,j in product([0,1], repeat2): plt.text(j-0.15, i, f{matrix[i,j,0]}, colorblack) plt.text(j0.15, i, f{matrix[i,j,1]}, colorblue) plt.title(囚徒困境收益矩阵(黑:A, 蓝:B)) plt.show() payoff, strategies prisoner_dilemma() plot_payoff(payoff, strategies)运行这段代码你会看到一个清晰的收益矩阵可视化。从图中可以直观发现尽管双方合作(-1,-1)比双双背叛(-2,-2)结果更好但背叛却是每个玩家的占优策略——这就是囚徒困境的核心矛盾。3. 智猪博弈模型构建智猪博弈描述了大猪和小猪在猪圈中按按钮获取食物的场景。我们这样实现def pigs_game(): # 策略: (大猪行动, 小猪行动) # 收益: (大猪, 小猪) payoff { (按, 等): (5, 4), (等, 按): (9, -1), (按, 按): (4, 1), (等, 等): (0, 0) } strategies [按, 等] return payoff, strategies payoff, strategies pigs_game() plot_payoff(payoff, strategies)分析热力图可以发现对小猪来说等是严格占优策略而大猪的最佳策略则取决于小猪的选择。这就是典型的序贯博弈特点。4. 纳什均衡的算法求解纳什均衡是指在其他玩家策略确定的情况下没有任何玩家能通过单方面改变策略获得更高收益的状态。我们可以编写一个通用求解函数def find_nash(payoff, strategies): nash_equilibria [] n len(strategies) # 检查每个策略组合 for combo in product(range(n), repeat2): a, b combo is_nash True # 检查玩家A是否有动机改变策略 for i in range(n): if payoff[(strategies[i], strategies[b])][0] payoff[(strategies[a], strategies[b])][0]: is_nash False break # 检查玩家B是否有动机改变策略 for j in range(n): if payoff[(strategies[a], strategies[j])][1] payoff[(strategies[a], strategies[b])][1]: is_nash False break if is_nash: nash_equilibria.append((strategies[a], strategies[b])) return nash_equilibria # 求解囚徒困境的纳什均衡 print(囚徒困境纳什均衡:, find_nash(*prisoner_dilemma())) # 输出: [(背叛, 背叛)] # 求解智猪博弈的纳什均衡 print(智猪博弈纳什均衡:, find_nash(*pigs_game())) # 输出: [(按, 等)]这个简单的求解算法验证了我们之前的直观分析。对于更复杂的博弈可以考虑使用支持枚举法或线性规划法来寻找混合策略纳什均衡。5. 博弈的重复与策略演化现实中的博弈往往不是一次性的。让我们模拟重复囚徒困境观察策略如何演化def repeated_prisoner(rounds100): # 定义策略函数 def tit_for_tat(history): if not history: return 合作 return history[-1][1] # 模仿对方上一步的选择 def always_betray(history): return 背叛 # 初始化 a_strategy, b_strategy tit_for_tat, always_betray history [] a_score, b_score 0, 0 payoff, _ prisoner_dilemma() for _ in range(rounds): a_move a_strategy(history) b_move b_strategy(history) outcome payoff[(a_move, b_move)] history.append((a_move, b_move)) a_score outcome[0] b_score outcome[1] print(f最终得分 - A: {a_score}, B: {b_score}) return history history repeated_prisoner()通过修改策略函数你可以尝试不同的策略组合观察长期互动中的得分变化。这是理解演化博弈论的绝佳起点。6. 进阶博弈论可视化工具为了更深入地分析博弈我们可以创建一个交互式可视化工具from ipywidgets import interact def interactive_payoff(a13, a20, a35, a41, b13, b25, b30, b41): payoff { (A1,B1): (a1,b1), (A1,B2): (a2,b2), (A2,B1): (a3,b3), (A2,B2): (a4,b4) } plot_payoff(payoff, [A1,A2], [B1,B2]) interact(interactive_payoff, a1(-5,5), a2(-5,5), a3(-5,5), a4(-5,5), b1(-5,5), b2(-5,5), b3(-5,5), b4(-5,5))这个工具允许你动态调整收益矩阵中的每个值实时观察博弈结构变化对纳什均衡的影响。通过这种互动方式你能更直观地理解不同博弈类型的区别。7. 实际应用与扩展方向掌握了这些基础模型后你可以尝试以下扩展多人博弈修改代码处理3个及以上玩家的场景演化博弈模拟群体中策略的传播与演化网络博弈研究网络结构对博弈结果的影响机器学习训练AI智能体在博弈中学习最优策略例如下面的代码展示了如何评估一个策略在随机对手下的表现def evaluate_strategy(strategy, trials1000): total_score 0 payoff, strategies prisoner_dilemma() opponent_choices np.random.choice(strategies, sizetrials) for opp_move in opponent_choices: my_move strategy([]) # 不考虑历史 outcome payoff[(my_move, opp_move)] total_score outcome[0] return total_score / trials print(随机策略平均得分:, evaluate_strategy(lambda _: np.random.choice([合作,背叛]))) print(总是合作平均得分:, evaluate_strategy(lambda _: 合作)) print(总是背叛平均得分:, evaluate_strategy(lambda _: 背叛))通过这些实践你会发现博弈论不再是抽象的数学理论而是分析现实决策问题的有力工具。从商业竞争到社交互动博弈的思维框架能帮助你做出更明智的选择。