别再死记概念了!用Python模拟‘囚徒困境’,5分钟搞懂帕累托最优和纳什均衡
用Python动态模拟囚徒困境可视化博弈论中的理性冲突博弈论中最经典的囚徒困境完美展现了个人理性选择与集体最优解之间的矛盾。作为数据科学爱好者我们完全可以用Python把这个抽象理论变成可交互的实验。本文将带你用不到50行代码构建完整的囚徒困境模型通过动态调整收益矩阵参数直观观察纳什均衡点与帕累托最优解的移动轨迹。1. 环境准备与基础模型搭建在Jupyter Notebook中我们首先导入必要的库import numpy as np import matplotlib.pyplot as plt from ipywidgets import interact, FloatSlider %matplotlib inline经典的囚徒困境收益矩阵可以表示为# 收益矩阵结构[玩家A选择合作, 玩家A选择背叛] payoff_matrix np.array([ [[-1, -1], [-10, 0]], # 玩家B选择合作时的收益 [[0, -10], [-5, -5]] # 玩家B选择背叛时的收益 ])这个矩阵中每个单元格的第一个数字表示玩家A的收益第二个数字表示玩家B的收益。例如当双方都选择合作时各自获得-1年刑期即坐牢1年当玩家A背叛而玩家B合作时A立即释放0B面临10年刑期。2. 纳什均衡的自动识别算法纳什均衡的核心特征是在给定其他玩家策略的情况下没有任何玩家可以通过单方面改变策略而获得更好结果。我们可以用以下函数自动识别纯策略纳什均衡def find_nash_equilibrium(payoff): nash_equilibria [] for a1 in [0, 1]: # 玩家A的策略选择 for a2 in [0, 1]: # 玩家B的策略选择 is_equilibrium True # 检查玩家A是否有动机偏离 for dev_a1 in [0, 1]: if payoff[dev_a1][a2][0] payoff[a1][a2][0]: is_equilibrium False break # 检查玩家B是否有动机偏离 for dev_a2 in [0, 1]: if payoff[a1][dev_a2][1] payoff[a1][a2][1]: is_equilibrium False break if is_equilibrium: nash_equilibria.append((a1, a2)) return nash_equilibria在标准囚徒困境中这个函数会返回[(1, 1)]即双方都选择背叛数字1代表背叛是唯一的纳什均衡。3. 帕累托最优的可视化分析帕累托最优是指在不损害任何一方利益的情况下无法再使至少一方变得更好的状态。我们可以用散点图展示所有可能的结果分布def plot_pareto_frontier(payoff): outcomes payoff.reshape(-1, 2) plt.scatter(outcomes[:,0], outcomes[:,1], colorblue) # 标记帕累托最优点 pareto_optimal [] for i in range(len(outcomes)): is_pareto True for j in range(len(outcomes)): if (outcomes[j][0] outcomes[i][0] and outcomes[j][1] outcomes[i][1] and (outcomes[j][0] outcomes[i][0] or outcomes[j][1] outcomes[i][1])): is_pareto False break if is_pareto: pareto_optimal.append(outcomes[i]) pareto_optimal np.array(pareto_optimal) plt.scatter(pareto_optimal[:,0], pareto_optimal[:,1], colorred, s100, label帕累托最优) plt.xlabel(玩家A收益) plt.ylabel(玩家B收益) plt.legend()运行这个函数会显示四个可能的结果点其中双方合作(-1,-1)和单方背叛(0,-10)、(-10,0)通常都是帕累托最优的而双方背叛(-5,-5)则不是。4. 动态参数调整与均衡变化让我们创建一个交互式工具实时观察收益参数变化如何影响均衡点def interactive_prisoners_dilemma(R, T, S, P): payoff np.array([ [[R, R], [S, T]], # R奖励T诱惑 [[T, S], [P, P]] # S傻瓜P惩罚 ]) nash_eq find_nash_equilibrium(payoff) strategies [合作, 背叛] plt.figure(figsize(10,4)) plt.subplot(1,2,1) plot_pareto_frontier(payoff) plt.title(帕累托前沿) plt.subplot(1,2,2) plt.imshow(payoff.sum(axis2), cmapcoolwarm) for i in range(2): for j in range(2): plt.text(j, i, f{payoff[i,j]}, hacenter, vacenter) for eq in nash_eq: plt.scatter(eq[1], eq[0], s500, facecolorsnone, edgecolorsgold, linewidth3) plt.xticks([0,1], [B合作, B背叛]) plt.yticks([0,1], [A合作, A背叛]) plt.title(纳什均衡(金圈标注)) plt.tight_layout() interact(interactive_prisoners_dilemma, RFloatSlider(min-20, max0, step0.5, value-1), TFloatSlider(min-20, max5, step0.5, value0), SFloatSlider(min-20, max0, step0.5, value-10), PFloatSlider(min-20, max0, step0.5, value-5))通过滑动条调整R(奖励)、T(诱惑)、S(傻瓜)、P(惩罚)四个参数可以观察到当T R且P S时系统呈现典型囚徒困境特征当T R P S时会出现两个纯策略纳什均衡当R T且S P时合作可能成为纳什均衡5. 混合策略与进化博弈模拟在重复博弈中玩家可以采用混合策略。我们可以模拟进化博弈过程def evolutionary_simulation(rounds100): strategies np.random.rand(2, 100) # 100对玩家初始策略 results [] for _ in range(rounds): # 计算每对玩家的选择 choices (np.random.rand(2, 100) strategies).astype(int) # 计算收益 payoffs np.array([ payoff_matrix[choices[0,i], choices[1,i]] for i in range(100) ]) # 策略更新模仿高收益策略 fitness payoffs.sum(axis1) new_strategies [] for i in range(100): mentor np.random.choice(100, pfitness/fitness.sum()) new_strategies.append(strategies[:,mentor] 0.1*(np.random.rand(2)-0.5)) strategies np.clip(np.array(new_strategies).T, 0, 1) results.append(strategies.mean(axis1)) plt.plot(np.array(results)) plt.xlabel(迭代次数) plt.ylabel(平均合作概率) plt.legend([玩家A, 玩家B])多次运行这个模拟会发现在标准囚徒困境参数下合作概率会逐渐降低到接近0但如果调整收益矩阵使RP TS则可能维持一定的合作概率。