《建设监理》网站深圳知名seo公司

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

《建设监理》网站,深圳知名seo公司,购物网站的设计思路,网站底部有很多图标我们都知道#xff0c;诸葛亮第一次北伐是最可能成功的#xff0c;魏国没有防备#xff0c;还策反了陇西#xff0c;陇西有大量的马匹可以装备蜀国骑兵#xff0c;可惜街亭一丢#xff0c;那边就守不住了 当时我不在#xff0c;只能作诗一首~ 如果穿越过去#xff0c;…我们都知道诸葛亮第一次北伐是最可能成功的魏国没有防备还策反了陇西陇西有大量的马匹可以装备蜀国骑兵可惜街亭一丢那边就守不住了 当时我不在只能作诗一首~ 如果穿越过去我将会向丞相献上一计别说街亭直接拿下长安先看地图 从延安洛阳策反魏国州长让他们出兵。然后再结盟孙权让他从久攻不下的合肥调来800精兵从襄阳进攻让魏延从宝鸡出兵自己率领大军从汉中进发 五路攻击光围都能把长安围死 但是这个时候你可能会说天方夜谭且不说孙权你怎么能确保洛阳和延安的兵听你的而不是反贼 这个呢就需要我们今天要讲的问题也称为【拜占庭将军问题】多节点场景没有中心化的协调而且其中可能出现不可靠结点的情况下如何保证大家行动的统一性 我们先约定一些共识 一个丞相发送指令四个将军接收所有人都可能是反贼反贼回复的指令和丞相的相反 现在我们模拟一个场景必须要五路进发才能够打下长安其中有反贼。当主路——也就是诸葛亮的那一路发出“进攻”指令时另外四路的将军会收到同时会向其他三路求证如果进攻指令数过半数就会进攻。但是反贼会回复别的将军【撤退】指令 如果反贼过多导致【撤退】指令过多所有的将军都不会出动丞相只能自己北伐了 那么此时忠反比多少才合适呢 关键在于即使有反贼存在只要忠臣数量足够多就可以保证最终的决策是正确的。 这是因为反贼无法破坏所有将军之间的通信因此忠臣可以通过相互交流确定反贼的存在并排除他们的虚假消息。最终的决策取决于忠臣的数量通常情况下当忠臣数量超过总将军数量的三分之二时算法可以保证正确性。 那么为什么是三分之二呢不是更多或者更少 假设发指令的是丞相其他为将军总数为n, 反贼数为m 其中每一个将军做判断的依据是接受到的指令取多数 每个将军自己在判断时只会考虑别的将军和丞相的指令排除自己所以此时有n - 1个指令那么会出现 m 个假指令和n - m - 1 个真指令 只要保证 n - m - 1 m也就是 n 2m 1即可 这是基本情况当n 3, m 1时满足n 2m 1但是忠臣只会收到一个真指令和一个假指令无法判断丞相或者另一个将军谁是反贼所以为了确保取 n 3m也就是忠臣占2/3多数
下面是一个简单的Java代码示例演示了如何解决这个问题。 假设有6个将军其中两个是反贼。每个将军都有一个唯一的ID和一个决策attack或retreat。这些将军之间通过消息传递来达成共识。 import java.util.Arrays; import java.util.Random; ​ public class ByzantineGenerals { ​private static final int NUM_GENERALS 6; ​private static final int REPEAT 5;static int traitor;static int traitor2;public static void main(String[] args) { ​String[] orders new String[NUM_GENERALS]; // 命令集合for (int p 0; p REPEAT; p) {traitor new Random().nextInt(NUM_GENERALS - 1);traitor2 new Random().nextInt(NUM_GENERALS);if (traitor traitor2) traitor2 1;for (int i 0; i NUM_GENERALS; i) {ordersi ? retreat : attack;} ​System.out.println(orders Arrays.toString(orders));boolean finalDecision computeFinalDecision(orders);System.out.println(Final decision: (finalDecision ? attack : retreat));System.out.println();}} ​private static boolean computeFinalDecision(String[] orders) {boolean[] decisions new boolean[NUM_GENERALS];for (int i 0; i NUM_GENERALS; i) {if (i traitor || i traitor2) {decisionsi;} else {boolean[] receivedOrders new boolean[NUM_GENERALS - 1];int index 0;for (int j 0; j NUM_GENERALS; j) {if (j ! i) {receivedOrdersindex; // 每一位将军收集命令}}decisions[i] computeDecision(receivedOrders);}}return computeDecision(decisions);} ​private static boolean computeDecision(boolean[] decisions) {// Compute the majority decisionint numTrue 0;int numFalse 0;for (boolean decision : decisions) {if (decision) {numTrue;} else {numFalse;}}return (numTrue numFalse);} ​ }在上面的示例代码中我们模拟了一个有6个将军的场景并随机指定两个将军为反贼。每个将军都有一个决策攻击或撤退。如果将军是反贼他将发送虚假的命令否则将军将发送他真正的命令。在每个将军之间进行消息传递后每个将军都会收到其他将军发送的命令。如果将军是反贼他可能会给每个将军发送不同的命令而忠臣将发送相同的命令。最后每个将军都会将他们收到的命令和自己的命令一起计算出一个最终的决策并将它们合并成一个共同的决策。 在计算决策的过程中我们使用了一个简单的投票算法。我们将每个将军的决策转换为一个布尔值attack为trueretreat为false然后计算出这些布尔值中出现次数最多的值。如果attack出现的次数比retreat多则我们最终的决策为attack否则为retreat。 输出之一如下 orders[retreat, retreat, attack, attack, attack, attack] Final decision: attack ​ orders[attack, attack, retreat, retreat, attack, attack] Final decision: attack ​ orders[attack, attack, attack, retreat, retreat, attack] Final decision: attack ​ orders[attack, attack, retreat, attack, retreat, attack] Final decision: attack ​ orders[retreat, attack, attack, attack, attack, retreat] Final decision: attack可以看到在6个将军2个反贼下是符合 n 2m 1的场景所以大家都是进攻 在n 3 m 1时n 2m 1需要替换为 n 3m 保险起见取 n 3m即可 在我看来这个问题是对投票解决问题的有效性和科学性很有力的佐证比如选举即使人民中藏了很多间谍或者是愚昧的人但是只要正常人占了2/3以上就可以确保这一制度的稳定与务实。 同时如果诸葛亮使用我的计策五路取长安那么完全可以兴复汉室还于旧都。剩下的只需要解决这一计策上面的两朵小乌云即可 如何防止孙权背刺如何策反魏国两个地方的军队