博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
拜占庭将军问题
阅读量:4677 次
发布时间:2019-06-09

本文共 2245 字,大约阅读时间需要 7 分钟。

Seven machines send information to each other.As long as the number sent is within 2.0 of the correct number,the answer is correct.Two of the machines are faulty.Find the number that each machine would compute it it use:

 

Sender

1

2

3

4

5

6

7

Receiver

OK

OK

OK

OK

OK

Faulty

Faulty

1

3

1.1

2.5

4.7

1.4

4.5

4.8

2

3

1.1

2.5

4.7

1.4

5

5

3

3

1.1

2.5

4.7

1.4

4.9

5

4

3

1.1

2.5

4.7

1.4

1

0.9

5

3

1.1

2.5

4.7

1.4

5

4.7

6

3

1.1

2.5

4.7

1.4

1.2

1

7

3

1.1

2.5

4.7

1.4

5.1

5.1

 

Dolev算法:

算法步骤:

1.去除每个PE所收到的信号的t=2个最大值,和t=2个最小值;(此处t为允许出错的最大PE数,t=(N-1)/3)

2.对每个PE保留的其余值求均值;

3.将每个PE得到的均值作为该PE的新信号发给其他PE,但6#、7#PE因故障仍然按最初的情形将信号发给其他PE。

4.再从第1步开始新的迭代,当各PE的均值收敛时,停止迭代。

Mathematica程序:

r={

{3,1.1,2.5,4.7,1.4,4.5,4.8},{3,1.1,2.5,4.7,1.4,5,5},{3,1.1,2.5,4.7,1.4,4.9,5},{3,1.1,2.5,4.7,1.4,1,0.9},{3,1.1,2.5,4.7,1.4,5,4.7},{3,1.1,2.5,4.7,1.4,1.2,1},{3,1.1,2.5,4.7,1.4,5.1,5.1}};
d=Length[r];
n=IntegerPart[(d-1)/3];
f[list_]:=TrimmedMean[Transpose[list],n/d];
a=NestWhileList[(r[[All,1;;(d-n)]] = Drop[#,-n];f@r)&,f@r,Mean[Abs[#2-#1]]>=0.01&,2];
a//Last
ListLinePlot[a,AxesOrigin->{1,1.5}]
ClearAll[r,d,f,a]

运行结果:

{3.4, 3.4, 3.4, 3.39259, 3.4, 3.39259, 3.4}

FCA算法:

算法步骤:

1.找出各PE每一个收到的值在其±2.0范围内与之相交的该PE收到的其他值的个数。

此处采取如下办法:

设某个PE从第i个PE和第j个PE接收到的值分别为a±2.0和b±2.0,则这两个值域相交的条件为

若a>b时,须a-2.0<b+2.0 即a-b<4.0;

同理,a<b时,须b-a<4.0

即只要|a-b|<4.0,则这两个值域必相交。

2.判断各PE值是否可接受。若与该值相交的值域个数大于等于4个(N-t-1),则该值是可接受的;

3.对每个PE的可接受值求均值,并以该均值替代该PE不可接受的值;

4.对每个PE求均值,并作为该PE的新信号发给其他PE,但6#、7#PE因故障仍然按最初的情形将信号发给其他PE。

5.再从第1步开始新的迭代,当各PE的均值收敛时,停止迭代。

Mathematica程序:

Clear["Golbal`*"];

r={
{3,1.1,2.5,4.7,1.4,4.5,4.8},{3,1.1,2.5,4.7,1.4,5,5},{3,1.1,2.5,4.7,1.4,4.9,5},{3,1.1,2.5,4.7,1.4,1,0.9},{3,1.1,2.5,4.7,1.4,5,4.7},{3,1.1,2.5,4.7,1.4,1.2,1},{3,1.1,2.5,4.7,1.4,5.1,5.1}};
d=Length[r];
n=IntegerPart[(d-1)/3];
f[list_] := Mean@Select[list,Tr[UnitBox[(list-#)/8.0]]>4&];
a=NestWhileList[(r[[All,1;; d-n]]=Drop[#,-n];f/@r)&,f/@r,Mean[Abs[#2-#1]]>=0.01 &,2][[2 ;; -2]];a//Last
ListLinePlot[a, AxesOrigin -> {1, 2}]
Clear[r, d, n, f, a]

运行结果:

{4.21569, 4.31569, 4.30141, 3.15855, 4.27284, 3.20141, 4.34427}

(未完待续)

两个算法是有很大差异的,具体大家自己体悟吧。

感谢Mathematica吧的无影冬瓜等网友对程序提出的指导和改进意见。

写这篇文也是为了让大家跟我一起学习和了解Mathematica的Powerful Ability。

真心希望Mathematica这个强大的软件不要在中国蒙尘!

转载于:https://www.cnblogs.com/neutrontsingh/p/5114215.html

你可能感兴趣的文章
数据库管理软件的由来
查看>>
Servlet容器如何处理请求资源路径
查看>>
Linux find 用法示例
查看>>
强悍高效率 92% Nixie Tube 升压电路 12V升150-250V(转)
查看>>
Happy Programming Contest
查看>>
四、K8S
查看>>
网页宽高clientWidth clientHeight获得数值不对的问题
查看>>
AX向在线用户发送消息
查看>>
程序员八荣八耻
查看>>
OCR引擎-Tesseract
查看>>
datagrid单元格格式化样式化
查看>>
转:在Nginx上配置多个站点
查看>>
leetcode : Remove Duplicates from Sorted List II [基础]
查看>>
常用正则汇集
查看>>
暑假集训 || 网络流
查看>>
吉日嘎拉DotNet.BusinessV4.2中的一处bug,及我的修复和扩展
查看>>
JVM学习笔记(一)JDK&JRE&JVM
查看>>
云计算商家必争之地 推荐几款云平台
查看>>
[转]B树(多向平衡查找树)详解
查看>>
ORACLE表、表分区、表空间的区别
查看>>