从囚徒困境到石头剪刀布:用Python模拟博弈论中的帕累托最优与纳什均衡
博弈论作为研究策略互动的数学工具,在经济学、计算机科学乃至日常决策中都有广泛应用。对于开发者而言,通过代码实现经典博弈模型不仅能加深理论理解,更能培养系统化思维。本文将用Python构建囚徒困境和石头剪刀布的仿真环境,通过可视化呈现策略互动中的帕累托最优与纳什均衡现象。
1. 环境准备与基础概念
在开始编码前,需要安装必要的Python库并理解核心概念。推荐使用Anaconda环境,通过以下命令安装依赖:
pip install numpy matplotlib seaborn帕累托最优描述的是资源分配的理想状态——任何改变都无法在不损害他人利益的情况下使至少一人获益。而纳什均衡则是策略组合的稳定点——在给定他人策略时,没有任何玩家能通过单方面改变策略获得更高收益。
这两个概念的关系可以通过支付矩阵直观呈现。以囚徒困境为例:
| 策略组合 | 玩家A收益 | 玩家B收益 | 性质分析 |
|---|---|---|---|
| (合作, 合作) | -1 | -1 | 帕累托最优 |
| (背叛, 合作) | 0 | -5 | 非均衡 |
| (合作, 背叛) | -5 | 0 | 非均衡 |
| (背叛, 背叛) | -3 | -3 | 纳什均衡 |
注意:表格中的收益值采用经典囚徒困境设定,实际数值可根据需要调整
2. 囚徒困境的Python实现
用NumPy构建支付矩阵,并通过策略模拟展示不同结果:
import numpy as np # 定义支付矩阵 (A收益, B收益) payoff_matrix = { ('C', 'C'): (-1, -1), # 双方合作 ('C', 'D'): (-5, 0), # A合作B背叛 ('D', 'C'): (0, -5), # A背叛B合作 ('D', 'D'): (-3, -3) # 双方背叛 } def simulate_prisoners_dilemma(strategy_a, strategy_b, rounds=100): a_scores, b_scores = [], [] for _ in range(rounds): outcome = payoff_matrix[(strategy_a(), strategy_b())] a_scores.append(outcome[0]) b_scores.append(outcome[1]) return np.cumsum(a_scores), np.cumsum(b_scores)可视化多次博弈的累计收益:
import matplotlib.pyplot as plt def plot_results(a_scores, b_scores): plt.figure(figsize=(10,6)) plt.plot(a_scores, label='玩家A') plt.plot(b_scores, label='玩家B') plt.xlabel('博弈轮次') plt.ylabel('累计收益') plt.legend() plt.grid(True) plt.show() # 模拟始终背叛策略 always_defect = lambda: 'D' a, b = simulate_prisoners_dilemma(always_defect, always_defect) plot_results(a, b)关键发现:
- 双方持续背叛会收敛到纳什均衡点
- 虽然(合作,合作)整体收益更高,但在非合作博弈中难以自发形成
3. 石头剪刀布的混合策略均衡
石头剪刀布作为零和博弈,其纳什均衡要求玩家采用特定概率分布:
from collections import Counter def mixed_strategy(prob_dist): choices = ['R', 'P', 'S'] return np.random.choice(choices, p=prob_dist) # 均衡策略 [1/3, 1/3, 1/3] equilibrium = [1/3, 1/3, 1/3] # 验证策略稳定性 def test_strategy(test_strat, opponent_strat, trials=1000): outcomes = [] for _ in range(trials): s1 = test_strat() s2 = opponent_strat() if s1 == s2: outcomes.append(0) elif (s1 == 'R' and s2 == 'S') or (s1 == 'S' and s2 == 'P') or (s1 == 'P' and s2 == 'R'): outcomes.append(1) else: outcomes.append(-1) return np.mean(outcomes) # 测试偏离均衡策略的效果 biased_strat = lambda: mixed_strategy([0.4, 0.3, 0.3]) print(f"偏离策略平均收益: {test_strategy(biased_strat, lambda: mixed_strategy(equilibrium))}")通过大量模拟可以发现:
- 任何偏离[1/3,1/3,1/3]的策略都会导致预期收益下降
- 当双方都采用均衡策略时,期望收益为零
4. 多智能体博弈仿真系统
构建可扩展的博弈框架,支持自定义规则和策略:
class GameSimulator: def __init__(self, payoff_matrix): self.payoff_matrix = payoff_matrix def add_player(self, strategy_func): self.players.append(strategy_func) def play_round(self): moves = [player() for player in self.players] return self.payoff_matrix[tuple(moves)] def evolutionary_simulation(self, generations=100): # 实现策略进化模拟 pass # 使用示例 pd_game = GameSimulator(payoff_matrix) pd_game.add_player(lambda: 'D' if np.random.rand() > 0.1 else 'C') pd_game.add_player(lambda: 'C' if np.random.rand() > 0.9 else 'D') results = [pd_game.play_round() for _ in range(100)]进阶功能建议:
- 添加记忆机制实现针锋相对策略
- 引入种群动态模拟策略进化
- 使用MLlib进行大规模策略空间搜索
5. 可视化分析与实践洞见
通过热力图展示策略组合的空间分布:
import seaborn as sns def plot_strategy_space(): c_probs = np.linspace(0, 1, 20) data = [] for p1 in c_probs: row = [] for p2 in c_probs: # 计算预期收益 row.append(p1*p2*(-1) + p1*(1-p2)*(-5) + (1-p1)*p2*0 + (1-p1)*(1-p2)*(-3)) data.append(row) plt.figure(figsize=(10,8)) sns.heatmap(data, xticklabels=np.round(c_probs,2), yticklabels=np.round(c_probs,2)) plt.xlabel('玩家B合作概率') plt.ylabel('玩家A合作概率') plt.title('策略空间收益分布') plt.show() plot_strategy_space()实际项目中的经验建议:
- 在有限次重复博弈中,合作更难维持
- 引入声誉机制可显著改善合作率
- 噪声(执行错误)会破坏精妙策略的稳定性