当前位置: 首页 > 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>

相关文章:

  • 【大模型实战篇】华为信创环境采用vllm部署QwQ-32B模型
  • 部署.NET6.0 Web API项目到Docker
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的电商直播流量转化路径研究
  • 【Linux】Makefile
  • AI大模型基础设施:主流的几款开源AI大语言模型的本地部署成本
  • kafka学习笔记(四、生产者(客户端)深入研究(二)——消费者协调器与_consumer_offsets剖析)
  • windows系统搭建自己的ftp服务器,保姆级教程(用户验证+无验证)
  • 简单的Qwen3的本地部署、分析与常见报错
  • CSS学习笔记14——移动端相关知识(rem,媒体查询,less)
  • RDMA高性能网络通信实践
  • 计算机视觉(CV)技术的优势和挑战(本片为InsCode)
  • 【分享】deepseek 超强ai助手 1.1.8最新版 不卡顿
  • jenkins 远程执行 定时 执行shell
  • SQL数据库系统全解析:从入门到实践
  • H7-TOOL固件2.29发布,支持各种第3方串口桥接功能,RTT自动重连,CAN/RTT/UART窗口独立同时刷新,增加多款脱机烧录(2025-04-30)
  • 多模态大语言模型arxiv论文略读(五十三)
  • Discover SubtitleMaster, the Ultimate Translation Tool for Creators!
  • Vue之脚手架与组件化开发
  • Linux 命令如何同时支持文件参数与管道输入?
  • 时序建模演进之路:从 MLP、RNN 到 LSTM 与 GRU
  • 短剧迷|《权宠》一出,《名不虚传》
  • 全文丨中华人民共和国传染病防治法
  • 百年传承,再启新程,参天中国迎来2.0时代
  • 探索演艺产业新路径,2万观众走进音乐科技融创节
  • 诗词文赋俱当歌,听一听古诗词中的音乐性
  • 巴防长称中俄可参与克什米尔恐袭事件国际调查,外交部回应