从“囚徒困境”到“性别战”:用Python代码模拟5个经典博弈论模型,理解Nash均衡
用Python实战博弈论5个经典模型的代码实现与可视化分析博弈论作为研究策略互动的数学工具在经济学、计算机科学甚至生物学领域都有广泛应用。但理论教材中的矩阵和公式往往让初学者望而生畏——直到我们用代码将这些抽象概念转化为可交互的模拟实验。本文将带你用Python构建五个经典博弈模型通过动态可视化理解Nash均衡的形成机制。不同于静态的理论分析我们将重点关注参数调整如何影响均衡结果以及如何用算法求解混合策略均衡。1. 环境配置与基础工具在开始建模前我们需要配置Python科学计算栈。推荐使用Anaconda创建专用环境conda create -n game_theory python3.9 conda activate game_theory pip install numpy matplotlib seaborn sympy关键库的作用NumPy处理博弈矩阵运算Matplotlib/Seaborn可视化支付矩阵与策略分布SymPy符号计算用于精确求解均衡点定义通用可视化函数用于后续所有模型的收益矩阵展示import matplotlib.pyplot as plt import seaborn as sns def plot_payoff_matrix(matrix, players, strategies): plt.figure(figsize(8, 6)) sns.heatmap(matrix, annotTrue, fmt.1f, cmapYlGnBu, xticklabelsstrategies[1], yticklabelsstrategies[0]) plt.xlabel(players[1] s Strategy) plt.ylabel(players[0] s Strategy) plt.title(Payoff Matrix Heatmap) plt.show()2. 囚徒困境理解占优策略作为最著名的非零和博弈囚徒困境完美展示了个人理性与集体理性的矛盾。我们先定义支付矩阵prisoners_payoff np.array([ [(-1, -1), (-3, 0)], # 囚徒A: 坦白/抵赖 [(0, -3), (-2, -2)] # 囚徒B: 同上 ])用plot_payoff_matrix()可视化后我们可以清晰地看到坦白是双方的严格占优策略。但更有趣的是模拟重复博弈场景def repeated_prisoners_dilemma(rounds, strategy_a, strategy_b): history [] for _ in range(rounds): move_a strategy_a(history) move_b strategy_b(history) payoff prisoners_payoff[move_a][move_b] history.append((move_a, move_b, payoff)) return np.cumsum([p for _,_,p in history], axis0)尝试不同策略组合时我们会发现以牙还牙(Tit-for-Tat)在长期互动中表现优异——这解释了为什么现实社会中合作可能自发形成。3. 性别战协调博弈与混合策略当夫妻选择周末活动时他们面临的是典型的协调博弈。支付矩阵如下battle_of_sexes np.array([ [(3, 2), (0, 0)], # 妻子: 足球/歌剧 [(0, 0), (2, 3)] # 丈夫: 同上 ])这个博弈有两个纯策略Nash均衡。我们使用SymPy计算混合策略均衡from sympy import symbols, Eq, solve p, q symbols(p q) # 妻子选足球概率丈夫选足球概率 # 计算妻子无差异条件 wife_eq Eq(3*q 0*(1-q), 0*q 2*(1-q)) husband_eq Eq(2*p 0*(1-p), 0*p 3*(1-p)) mixed_eq solve((wife_eq, husband_eq), (p, q)) print(f混合策略均衡: p{mixed_eq[p]:.2f}, q{mixed_eq[q]:.2f})输出显示妻子有3/5概率选择足球丈夫有2/5概率选择足球。我们可以用蒙特卡洛模拟验证这个均衡def mixed_strategy_simulation(samples, p, q): choices np.random.rand(samples, 2) wife_choice (choices[:,0] p).astype(int) husband_choice (choices[:,1] q).astype(int) payoffs battle_of_sexes[wife_choice, husband_choice] return payoffs.mean(axis0)4. 古诺模型连续策略空间的均衡在寡头产量竞争中企业需要同时决定产量。我们用SciPy求解均衡from scipy.optimize import minimize def cournot_profit(q1, q2, a100, c10): a为市场容量c为边际成本 price a - q1 - q2 return (price - c) * q1 # 企业1的最优反应函数 def best_response(q2, a100, c10): res minimize(lambda q: -cournot_profit(q, q2, a, c), x030, bounds[(0, a)]) return res.x[0] # 计算均衡点 q1_star best_response(best_response(30)) q2_star best_response(q1_star) print(f古诺均衡产量: q1{q1_star:.1f}, q2{q2_star:.1f})可视化反应函数曲线时两条曲线的交点即为Nash均衡点。调整市场容量参数a可以观察到均衡如何随市场环境变化。5. 霍特林模型空间竞争与差异化这个模型解释为什么政客政策会趋同。假设线性城市长度为1两家商店选择位置def hotelling_profit(loc1, loc2, price1, t0.1): t为运输成本系数 if loc1 loc2: return price/2 boundary (loc1 loc2)/2 return price*boundary if loc1 loc2 else price*(1-boundary) # 寻找位置均衡 def find_location_equilibrium(tolerance1e-3): loc1, loc2 0.2, 0.8 # 初始位置 while True: new_loc1 best_response_loc(loc2) new_loc2 best_response_loc(loc1) if abs(new_loc1-loc1)tolerance and abs(new_loc2-loc2)tolerance: break loc1, loc2 new_loc1, new_loc2 return loc1, loc2模拟结果显示两家商店最终会聚集在中心点——这与现实中快餐店经常比邻而开的现象一致。修改运输成本参数t可以观察到均衡位置如何随消费者对距离的敏感度变化。