当前位置: 首页 > 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.jsqmd.com/news/928162/

相关文章:

  • 数据科学自由职业:5步构建个人品牌与稳定获客体系
  • 乐清虹桥家长亲测:双语幼儿园的真实品质标尺 - 奔跑123
  • 丙午年六一感怀
  • 打卡信奥刷题(3348)用C++实现信奥题 P9505 『MGOI』Simple Round I | D. 魔法环
  • 2026年最新德阳市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • DuQuant++:针对MXFP4激活异常值的块对齐旋转量化优化方案
  • 如何快速突破百度网盘限速:3步实现免费高速下载的完整方案
  • Arm CoreLink NI-710AE NoC架构与安全隔离机制解析
  • 2026年5月广州除甲醛公司推荐:靠谱品牌TOP榜单深度测评解析 - 品牌推荐
  • 别再只写单向RNN了!PyTorch中BiGRU的隐藏层拼接与梯度处理避坑指南
  • 从零到播放:手把手教你用LiveCMS+LiveSMS搭建一个可用的GB28181视频监控测试环境
  • 2026年最新德州市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • 若依RuoYi-Vue项目实战:手把手教你集成微信小程序OpenID免密登录(Spring Security改造避坑)
  • 别再用裸机死循环了!用STM32CubeMX+FreeRTOS实现多任务切换,保姆级配置流程(Keil仿真)
  • ChatGPT时代,智能合约工程师如何利用AI提升开发效率与安全?
  • 从Arduino到3D打印机:手把手教你用TB6600HG驱动42步进电机(含电流调节与散热指南)
  • 告别数据标注!用Hugging Face的CLIP模型,5分钟搞定零样本图片分类(附完整代码)
  • 杭州奢侈品包包回收排行榜,2026 金榜商家合扬诚信回收 - 合扬奢侈品交易中心
  • 避坑指南:OV9281调试中HTS/VTS与曝光时间的那些‘坑’(附计算工具与排查思路)
  • 智慧树自动刷课插件:3步实现自动化学习,节省80%手动操作时间
  • 2026年最新定西市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭
  • 2026鹤壁市最具性价比(黄金+K金+白银+铂金)正规靠谱回收门店实力排行榜推荐及联系方式 - 前途无量YY
  • 告别虚拟机!在Windows 10/11上直接运行Swift代码的三种亲测方案
  • AI招聘全流程应用指南:从人才寻源到智能决策的实践与风险应对
  • 时间序列预测:从白噪声到积分模型的黄金基准实践
  • 科研项目资助体系与多学科团队协作实践
  • Windows 11 下用 PyTorch 1.13 + TorchRL 搞定 MuJoCo 环境,手把手教你跑通 PPO 算法(附避坑指南)
  • 构建技术团队的加速引擎:从CI/CD到心流开发的实战体系
  • Dell R730老当益壮:ESXi 8.0 vs 7.0定制版怎么选?实测安装与驱动兼容性指南
  • 2026年最新东莞市金银首饰回收+金条金币+铂金K金 高价回收;实体老店回收黄金 多年口碑 交易放心;TOP5实力权威排行榜推荐+联系方式 - 亦辰小黄鸭