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

python拜占庭将军

功能:

1.定义了一个General类,用于表示每个将军的状态和行为。
2.实现了一个拜占庭容错算法的模拟过程,处理多轮消息交换和决策。
3.初始化指挥官发送命令,并根据叛徒情况调整消息内容。
4.每轮决策采用多数决原则。
5.测试框架验证算法正确性,包括一致性和遵循指挥官命令的条件。
6.处理合法和非法测试用例,进行压力测试。

step1:C:\Users\wangrusheng\PycharmProjects\FastAPIProject1\hello.py

import randomclass General:def __init__(self, id, is_traitor=False):self.id = idself.is_traitor = is_traitorself.received_orders = {}  # 按轮次存储收到的命令 {round: {sender_id: order}}self.decisions = {}  # 按轮次存储的决策 {round: decision}def receive_order(self, sender_id, order, round):"""接收来自sender_id的命令,记录到对应的轮次"""if round not in self.received_orders:self.received_orders[round] = {}self.received_orders[round][sender_id] = orderdef byzantine_simulation(num_generals, traitor_ids, commander_order):t = len(traitor_ids)required_rounds = t + 1  # 根据拜占庭容错算法确定所需轮次# 初始化将军们generals = {gid: General(gid, gid in traitor_ids) for gid in range(num_generals)}# 初始轮次(轮次0):指挥官发送命令commander = generals[0]for receiver_id in generals:if receiver_id == 0:continue# 叛徒指挥官发送随机命令,否则发送真实命令order = random.choice([True, False]) if commander.is_traitor else commander_ordergenerals[receiver_id].receive_order(0, order, 0)# 计算初始轮次的决策for general in generals.values():if general.id == 0:continueorders = general.received_orders.get(0, {})true_count = sum(orders.values())general.decisions[0] = true_count > len(orders) / 2# 进行多轮消息交换for current_round in range(1, required_rounds):# 收集当前轮次的消息for sender_id in generals:sender = generals[sender_id]if sender.id == 0:continue  # 指挥官只在第一轮发送for receiver_id in generals:if receiver_id in [0, sender_id]:continue# 确定发送的消息内容if sender.is_traitor:order = random.choice([True, False])  # 叛徒发送随机消息else:# 忠诚将军发送上一轮的决策prev_round = current_round - 1order = sender.decisions.get(prev_round, False)generals[receiver_id].receive_order(sender_id, order, current_round)# 计算当前轮次的决策for general in generals.values():if general.id == 0:continueorders = general.received_orders.get(current_round, {})true_count = sum(orders.values())general.decisions[current_round] = true_count > len(orders) / 2# 生成最终决策结果decisions = {}for gid in generals:if gid == 0:continuefinal_decision = generals[gid].decisions.get(required_rounds - 1, False)decisions[gid] = final_decisionreturn decisionsdef run_comprehensive_tests():test_cases = [(4, [3], True),(4, [3], False),(7, [2, 4], True),(7, [1, 5], False),(10, [3, 6, 9], True)]for case in test_cases:num_generals, traitor_ids, commander_order = caset = len(traitor_ids)# 拜占庭容错基本条件检查if num_generals < 3 * t + 1:print(f"跳过不合法测试:将军数{num_generals} < 3*{t}+1")continueprint(f"\n测试案例:将军数={num_generals}, 叛徒={traitor_ids}, 指挥官命令={'进攻' if commander_order else '撤退'}")result = byzantine_simulation(num_generals=num_generals,traitor_ids=traitor_ids,commander_order=commander_order)# 展示结果print("将军决策:")for gid in sorted(result.keys()):status = "叛徒" if gid in traitor_ids else "忠诚"action = "进攻" if result[gid] else "撤退"print(f"将军 {gid:2} ({status}): {action}")# 验证一致性loyal_generals = [gid for gid in result if gid not in traitor_ids]loyal_decisions = [result[gid] for gid in loyal_generals]if len(loyal_decisions) == 0:print("无忠诚将军")continueconsistent = all(d == loyal_decisions[0] for d in loyal_decisions)print("所有忠诚将军达成一致:" + ("成功" if consistent else "失败"))# 如果指挥官忠诚,检查是否遵循命令commander = 0if commander not in traitor_ids:expected_decision = commander_orderactual_decisions = set(loyal_decisions)assert len(actual_decisions) == 1, "忠诚将军意见不一致"assert actual_decisions.pop() == expected_decision, "忠诚将军未遵循指挥官命令"if __name__ == "__main__":# 运行多组测试案例run_comprehensive_tests()# 随机压力测试print("\n正在进行随机压力测试...")for _ in range(100):t = random.randint(1, 3)n = 3 * t + 1 + random.randint(0, 2)traitor_ids = random.sample(range(1, n), t)commander_order = random.choice([True, False])print(f"测试案例:n={n} t={t} 叛徒={traitor_ids} 命令={'进攻' if commander_order else '撤退'}")try:result = byzantine_simulation(n, traitor_ids, commander_order)loyal_generals = [gid for gid in result if gid not in traitor_ids]loyal_decisions = [result[gid] for gid in loyal_generals]if loyal_generals:consistent = all(d == loyal_decisions[0] for d in loyal_decisions)assert consistent, "忠诚将军未达成一致"if 0 not in traitor_ids:assert all(d == commander_order for d in loyal_decisions), "未遵循忠诚指挥官命令"except AssertionError as e:print(f"测试失败:{e}")print("详细结果:")for gid in sorted(result.keys()):status = "叛徒" if gid in traitor_ids else "忠诚"action = "进攻" if result[gid] else "撤退"print(f"将军 {gid:2} ({status}): {action}")exit(1)print("所有压力测试通过!")

step2:运行结果:

(.venv) PS C:\Users\wangrusheng\PycharmProjects\FastAPIProject1> python hello.py测试案例:将军数=4, 叛徒=[3], 指挥官命令=进攻
将军决策:
将军  1 (忠诚): 进攻
将军  2 (忠诚): 进攻
将军  3 (叛徒): 进攻
所有忠诚将军达成一致:成功测试案例:将军数=4, 叛徒=[3], 指挥官命令=撤退
将军决策:
将军  1 (忠诚): 撤退
将军  2 (忠诚): 撤退
将军  3 (叛徒): 撤退
所有忠诚将军达成一致:成功测试案例:将军数=7, 叛徒=[2, 4], 指挥官命令=进攻
将军决策:
将军  1 (忠诚): 进攻
将军  2 (叛徒): 进攻
将军  3 (忠诚): 进攻
将军  4 (叛徒): 进攻
将军  5 (忠诚): 进攻
将军  6 (忠诚): 进攻
所有忠诚将军达成一致:成功测试案例:将军数=7, 叛徒=[1, 5], 指挥官命令=撤退
将军决策:
将军  1 (叛徒): 撤退
将军  2 (忠诚): 撤退
将军  3 (忠诚): 撤退
将军  4 (忠诚): 撤退
将军  5 (叛徒): 撤退
将军  6 (忠诚): 撤退
所有忠诚将军达成一致:成功测试案例:将军数=10, 叛徒=[3, 6, 9], 指挥官命令=进攻
将军决策:
将军  1 (忠诚): 进攻
将军  2 (忠诚): 进攻
将军  3 (叛徒): 进攻
将军  4 (忠诚): 进攻
将军  5 (忠诚): 进攻
将军  6 (叛徒): 进攻
将军  7 (忠诚): 进攻
将军  8 (忠诚): 进攻
将军  9 (叛徒): 进攻
所有忠诚将军达成一致:成功正在进行随机压力测试...
测试案例:n=6 t=1 叛徒=[3] 命令=进攻
测试案例:n=6 t=1 叛徒=[4] 命令=撤退
测试案例:n=12 t=3 叛徒=[7, 11, 2] 命令=撤退
测试案例:n=8 t=2 叛徒=[3, 2] 命令=进攻
测试案例:n=10 t=3 叛徒=[6, 9, 1] 命令=进攻
测试案例:n=10 t=3 叛徒=[8, 5, 7] 命令=进攻
测试案例:n=6 t=1 叛徒=[5] 命令=进攻
测试案例:n=6 t=1 叛徒=[4] 命令=进攻
测试案例:n=6 t=1 叛徒=[2] 命令=进攻
测试案例:n=5 t=1 叛徒=[4] 命令=撤退
测试案例:n=9 t=2 叛徒=[2, 5] 命令=撤退
测试案例:n=5 t=1 叛徒=[2] 命令=撤退
测试案例:n=9 t=2 叛徒=[5, 2] 命令=撤退
测试案例:n=9 t=2 叛徒=[7, 2] 命令=进攻
测试案例:n=9 t=2 叛徒=[2, 6] 命令=进攻
测试案例:n=5 t=1 叛徒=[2] 命令=进攻
测试案例:n=7 t=2 叛徒=[4, 5] 命令=撤退
测试案例:n=6 t=1 叛徒=[2] 命令=进攻
测试案例:n=4 t=1 叛徒=[2] 命令=进攻
测试案例:n=5 t=1 叛徒=[4] 命令=进攻
测试案例:n=7 t=2 叛徒=[3, 2] 命令=撤退
测试案例:n=6 t=1 叛徒=[1] 命令=撤退
测试案例:n=7 t=2 叛徒=[2, 5] 命令=进攻
测试案例:n=11 t=3 叛徒=[3, 4, 1] 命令=进攻
测试案例:n=10 t=3 叛徒=[1, 2, 4] 命令=进攻
测试案例:n=5 t=1 叛徒=[1] 命令=进攻
测试案例:n=4 t=1 叛徒=[1] 命令=进攻
测试案例:n=8 t=2 叛徒=[5, 2] 命令=撤退
测试案例:n=9 t=2 叛徒=[3, 4] 命令=撤退
测试案例:n=5 t=1 叛徒=[3] 命令=撤退
测试案例:n=6 t=1 叛徒=[4] 命令=撤退
测试案例:n=5 t=1 叛徒=[1] 命令=进攻
测试案例:n=8 t=2 叛徒=[3, 7] 命令=进攻
测试案例:n=10 t=3 叛徒=[9, 6, 8] 命令=进攻
测试案例:n=7 t=2 叛徒=[3, 6] 命令=撤退
测试案例:n=6 t=1 叛徒=[1] 命令=撤退
测试案例:n=10 t=3 叛徒=[2, 9, 5] 命令=撤退
测试案例:n=4 t=1 叛徒=[3] 命令=进攻
测试失败:忠诚将军未达成一致
详细结果:
将军  1 (忠诚): 撤退
将军  2 (忠诚): 进攻
将军  3 (叛徒): 进攻
(.venv) PS C:\Users\wangrusheng\PycharmProjects\FastAPIProject1>
http://www.xdnf.cn/news/246133.html

相关文章:

  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的电商直播流量转化路径研究
  • 计算机操作系统知识集合
  • 2025五一杯B题五一杯数学建模思路代码文章教学: 矿山数据处理问题
  • android 中的AMS 和 WMS
  • 【Day 14】HarmonyOS分布式数据库实战
  • linux下安装ollama网不好怎么办?
  • C++类和对象
  • c++文字游戏_废弃医院篇1.0
  • MySQL 查找指定表名的表的主键
  • javaScript——DOM续(五)
  • Vercel 全面指南:从零部署到高级实践
  • RAG技术完全指南(一):检索增强生成原理与LLM对比分析
  • Java反射机制终极指南:从基础到高级应用
  • 浅谈高校教育改革
  • C语言中数字转化为字符串的方法
  • 计算机视觉——基于树莓派的YOLO11模型优化与实时目标检测、跟踪及计数的实践
  • 网络通信问题及解决方案
  • 【LeetCode Hot100】图论篇
  • Winform(7.序列化方式整理)
  • QML Image 组件详解
  • 课题推荐——通信信号处理中的非线性系统状态估计(如信号跟踪、相位恢复等场景),使用无迹卡尔曼滤波(UKF)的非线性滤波算法,MATLAB实现
  • 数据结构之-----“交换排序”“归并排序”“计数排序”
  • JavaScript性能优化实战之资源加载与构建优化
  • 使用Set和Map解题思路
  • 奥地利学派方法论的三个基础
  • Java 算法入门:从基础概念到实战示例
  • 数字智慧方案6166丨智慧医养结合大数据平台方案(50页PPT)(文末有下载方式)
  • SpringBoot开发——SpringBoot3.4.3整合SpringThymeleaf、SpringSecurity搭建简易的管理后台,完成授权登录
  • 【设计模式】GoF设计模式之备忘录模式(Memento Pattern)
  • 文件操作--文件包含漏洞