当前位置: 首页 > news >正文

用Python模拟《信任的进化》博弈游戏:复读机策略为何总能赢?

用Python模拟《信任的进化》博弈游戏:复读机策略为何总能赢?

在博弈论的世界里,一个简单的"复读机"策略常常能击败看似更复杂的对手。这种现象在经典博弈游戏《信任的进化》中表现得尤为明显。本文将带你用Python构建一个完整的博弈模拟系统,通过代码和数据揭示复读机策略背后的制胜逻辑。

1. 博弈策略的Python实现

我们先定义五种经典策略的决策逻辑。每种策略都是一个函数,接收历史交互记录,返回当前回合的选择("合作"或"欺骗")。

def tit_for_tat(history): """复读机策略:第一回合合作,之后模仿对方上一回合的选择""" if not history: # 首次交互 return "合作" return history[-1][1] # 返回对方上一步的选择 def always_cheat(history): """老油条策略:永远欺骗""" return "欺骗" def always_cooperate(history): """小粉红策略:永远合作""" return "合作" def random_choice(history): """胡乱来策略:随机选择""" import random return random.choice(["合作", "欺骗"]) def grudger(history): """黑帮老铁策略:开始合作,一旦被欺骗就永远欺骗""" if any(opp_move == "欺骗" for _, opp_move in history): return "欺骗" return "合作"

这些策略函数将成为我们模拟系统的基础组件。值得注意的是,复读机策略的实现异常简洁——这正是它强大之处:用最少的规则产生最稳定的合作。

2. 博弈收益矩阵与交互模拟

博弈的收益规则直接影响策略的演化。我们用一个字典来定义不同选择组合的得分:

PAYOFF_MATRIX = { ("合作", "合作"): (3, 3), ("合作", "欺骗"): (-1, 5), ("欺骗", "合作"): (5, -1), ("欺骗", "欺骗"): (0, 0) } def play_round(strategy1, strategy2, history1, history2): """执行一轮博弈,更新历史记录和得分""" move1 = strategy1(history2) move2 = strategy2(history1) score1, score2 = PAYOFF_MATRIX[(move1, move2)] return (move1, move2), (score1, score2)

这个收益矩阵体现了囚徒困境的核心特征:单方面欺骗能获得最大收益(5分),但双方合作的总收益最高(6分)。这种张力正是博弈复杂性的来源。

3. 多轮锦标赛模拟系统

为了全面评估策略表现,我们需要构建一个完整的锦标赛系统:

def run_tournament(strategies, rounds=10, iterations=100): """运行多轮锦标赛,返回各策略平均得分""" results = {strategy.__name__: 0 for strategy in strategies} for _ in range(iterations): for i, s1 in enumerate(strategies): for s2 in strategies[i:]: # 避免重复对战 history1, history2 = [], [] total1, total2 = 0, 0 for _ in range(rounds): moves, scores = play_round(s1, s2, history1, history2) history1.append((moves[0], moves[1])) history2.append((moves[1], moves[0])) total1 += scores[0] total2 += scores[1] results[s1.__name__] += total1 if s1 != s2: results[s2.__name__] += total2 # 计算平均得分 for strategy in results: results[strategy] /= iterations * (len(strategies) - 0.5) return results

这个模拟器可以调整两个关键参数:

  • rounds:每对策略交互的回合数
  • iterations:重复实验次数(减少随机性影响)

4. 模拟结果与策略分析

让我们运行一个包含五种策略的锦标赛,设置10轮交互和100次迭代:

strategies = [tit_for_tat, always_cheat, always_cooperate, random_choice, grudger] results = run_tournament(strategies, rounds=10, iterations=100) # 结果排序 sorted_results = sorted(results.items(), key=lambda x: x[1], reverse=True) for name, score in sorted_results: print(f"{name:20}: {score:.2f}")

典型输出结果可能如下:

tit_for_tat : 2.85 grudger : 2.62 always_cooperate : 2.15 random_choice : 1.78 always_cheat : 1.55

这个结果验证了复读机策略的优越性。但为什么它能胜出?我们可以从几个维度分析:

策略互动矩阵分析

对战组合复读机得分对手得分总得分
复读机 vs 复读机336
复读机 vs 老油条-154
复读机 vs 小粉红336
复读机 vs 胡乱来≈1.5≈1.5≈3
复读机 vs 黑帮老铁336

关键发现:

  1. 复读机与其他合作型策略能建立稳定的互利关系
  2. 面对欺骗者虽然单次吃亏,但不会陷入无限报复的恶性循环
  3. 总得分在大多数组合中保持领先

回合数对结果的影响

我们固定其他参数,改变交互轮数,观察策略表现变化:

rounds_range = range(1, 21) performance = {s.__name__: [] for s in strategies} for r in rounds_range: res = run_tournament(strategies, rounds=r, iterations=50) for name in res: performance[name].append(res[name])

将数据可视化后(此处为文字描述),可以清晰看到:

  • 短期交互(1-5轮):老油条策略占优
  • 中长期交互(6+轮):复读机优势逐渐显现
  • 小粉红策略随着轮次增加表现下降明显

5. 策略优化与变体实验

基于标准复读机策略,我们可以尝试一些改进版本:

def tit_for_two_tats(history): """两报还一报:被连续欺骗两次才报复""" if len(history) < 2: return "合作" if history[-1][1] == "欺骗" and history[-2][1] == "欺骗": return "欺骗" return "合作" def generous_tit_for_tat(history, forgiveness=0.1): """宽容复读机:有小概率原谅欺骗""" import random if not history: return "合作" if history[-1][1] == "欺骗" and random.random() < forgiveness: return "合作" return history[-1][1]

测试这些变体策略的表现:

advanced_strategies = [tit_for_tat, tit_for_two_tats, generous_tit_for_tat, always_cheat] adv_results = run_tournament(advanced_strategies, rounds=15, iterations=200) # 结果显示宽容复读机在长期交互中表现更优

6. 群体演化模拟

更接近真实世界的模拟是观察策略在群体中的演化。我们实现一个简单的遗传算法模型:

def evolutionary_simulation(population, generations=50): """群体演化模拟""" for _ in range(generations): # 评估适应度 fitness = {ind: 0 for ind in population} for i, s1 in enumerate(population): for s2 in population[i+1:]: _, scores = play_match(s1, s2, rounds=10) fitness[s1] += scores[0] fitness[s2] += scores[1] # 选择与繁殖 total_fitness = sum(fitness.values()) probabilities = [f/total_fitness for f in fitness.values()] new_population = random.choices(population, weights=probabilities, k=len(population)) population = new_population return Counter(population).most_common()

多次运行这个模拟,复读机及其变种通常会占据群体主导地位,验证了其��演化上的稳定性。

http://www.rkmt.cn/news/1439494.html

相关文章:

  • Arm CoreLink NI-710AE NoC架构与安全隔离机制解析
  • 别再只写单向RNN了!PyTorch中BiGRU的隐藏层拼接与梯度处理避坑指南
  • ChatGPT时代,智能合约工程师如何利用AI提升开发效率与安全?
  • 智慧树自动刷课插件:3步实现自动化学习,节省80%手动操作时间
  • 2026鹤壁市最具性价比(黄金+K金+白银+铂金)正规靠谱回收门店实力排行榜推荐及联系方式 - 前途无量YY
  • 时间序列预测:从白噪声到积分模型的黄金基准实践
  • Windows 11 下用 PyTorch 1.13 + TorchRL 搞定 MuJoCo 环境,手把手教你跑通 PPO 算法(附避坑指南)
  • 科研项目资助体系与多学科团队协作实践
  • 构建技术团队的加速引擎:从CI/CD到心流开发的实战体系
  • 企业AI项目启动前必问的10个问题:从战略到落地的实战指南
  • 终极指南:3种方法彻底移除Windows Defender,释放30%系统性能
  • 告别蓝屏!保姆级教程:用技嘉工具给NVMe固态硬盘装Win7(含USB3.0/NVMe驱动整合)
  • 玩转DevEco Studio预览器:除了看手机UI,还能一键对比平板、折叠屏效果?
  • AI写作去机器化:四层改造法让生成内容更自然可信
  • 别再死记硬背公式了!用MATLAB R2023b手把手复现4FSK调制解调全过程
  • 别再只调学习率了!用Focal Loss解决目标检测中样本不平衡的实战指南(附PyTorch代码)
  • KNX智能家居入门避坑:手把手教你用ETS5配置调光灯带(附雷特电源参数设置)
  • UE5蓝图实战:用样条线+Spline Mesh组件打造可交互的3D测距工具(附控件蓝图源码)
  • 手把手教你用稳态平板法测橡胶导热系数(附Python数据处理脚本)
  • 别再死记硬背了!用这3个真实代码片段,5分钟搞懂PAD图和N-S图的区别与画法
  • 避开Gazebo默认插件坑:手把手教你为Livox Avia/Mid-360激光雷达配置专属仿真模型
  • 会议平板哪家好:排名前五专业深度测评解析 - 服务品牌热点
  • 数据科学如何量化分析RTO政策效果:从因果推断到个性化办公方案
  • RK3568开发板HDMI没信号?从热插拔检测到I2C通信,一步步教你硬件调试
  • V-REP/CoppeliaSim机械臂轨迹可视化实战:不用Matlab,5分钟搞定末端轨迹3D曲线
  • 用Keil模拟器“慢放”FreeRTOS任务调度:手把手带你理解抢占式内核到底怎么工作的
  • 3分钟上手英雄联盟智能助手:Seraphine让你的游戏决策更明智
  • 别再纠结YOLO版本了!用Ultralytics 8.3.x一站式搞定YOLOv5到v11的训练(附最新混合精度配置避坑)
  • 2025-2026年北京私立初中推荐:十大榜评测选择指南性价比高学费 - 品牌推荐
  • 从继电器到MOS管:我的智能家居传感器电源管理‘踩坑’与优化实录