java实现拜占庭将军_每日一题 | 拜占庭将军问题

这篇博客探讨了一个有趣的数学策略,涉及概率和图论,使得100名囚犯能在有限次尝试内找到各自编号。此外,还介绍了拜占庭将军问题,讨论了在存在叛徒的情况下,如何确保多数忠诚将军能达成一致决策而不受叛徒影响的问题。
摘要由CSDN通过智能技术生成

65b136c49d353711dee22129c7c36f93.png

昨日问题

这道题来源于读者投稿,解法来源于知乎。

很显然,每个囚犯最多打开50个抽屉,抽中自己号码的概率是1/2。但是我们有100个囚犯,这100个囚犯都找到自己号码的概率就是2的一百次方分之一。咱们也不必要去计算这个值,显然是一个天文数字。

那么有没有更好的策略呢?

其实是有的,并且非常巧妙,巧妙到几乎很难想到。策略是对于囚犯i,他首先打开i号抽屉,如果i号抽屉当中就是i,显然他成功找到了。假设抽屉当中是号码j,那么他继续打开j号抽屉,重复上述过程,直到找到了号码i或者是用完了50次机会。

比如在这个例子当中,所有人都可以在用完机会之前找到自己的号码。

fb430edf9fbae38895771b42a0ef56da.png

那么这种操作的原理是什么?

原理就是找环,我们把问题进行抽象和转化。首先我们把抽屉上的号码看成是起始点,把抽屉里的卡片号码看成是终点。这样我们就连出了一条有向边,比如1号抽屉里是7号卡片,我们就得到了一条从1指向7的边,一共有100个抽屉100张卡片,所以就有100个点和100条边。

再加上每个点的入度和出度都是1,那么根据图论中点和边的性质,我们可以确定,每一个点都在环当中。那么剩下的就很好办了,环是确定的,不确定的就是环的大小。

对于一个确定的点i来说,它所在的环长度可能是1也可能是100。只要大于50,我们就无法找到解了。

那么这个概率应该怎么算呢?

首先,可以确定的是如果存在长度大于50的环,这个环一定只有1个。我们假设它的长度是L,那么,这个环的构成情况一共有C(100, L)种,这里的C表示组合数。对于每一种组合来说,一共有(L-1)!种排列,因为是一个环,所以不是L!。

这个环之外的元素有100-L个,它们的排列有(100 - L)!种。对于每一个L都有C(100, L) * (L-1)! * (100 - L)!=100!/L种情况。而100个数的总排列是100!,所以我们可以得到所有囚犯都猜对的概率是:

fe2c35e86fc3fa2c5a07a41a4c8244e5.png

这里的计算看起来复杂,其实用到的只是小学的奥数排列组合的知识。不管怎么说,从结果上来看,这个概率显然比瞎猜要大得多的多了。

今日问题

拜占庭将军问题

拜占庭帝国为了征讨一座城堡派出了7个将军各自率领一个队伍,这个城堡非常坚固,必须要有一半以上的将军一起进攻才可以获胜,否则将会失败。由于科技落后,将军之间只能通过传令兵进行通信。

将军之间约定各自发出是否进攻的投票,如果收到进攻的意见超过半数则发起进攻。但由于7个将军当中混入了2个叛徒,叛徒会发出虚假的指令,比如向决定进攻的将军发送进攻,向想要撤退的将军发出撤退。比如3个忠诚的将军下令进攻,2个将军下令撤退,这时两个叛徒向3个忠诚的将军发送进攻,向2个想要撤回的将军发送撤退,这样将会导致实际进攻的将军只有3个,这会导致战争的失败。

假设现在将军们已经发现了叛徒的存在但不知道是哪两个将军是叛徒,忠诚的将军们应该采用什么样的方法才可以保证做出的决策不被叛徒影响?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值