我已经阅读了他的开创性论文Self-stabilizing systems in spite of distributed control。但是,我不太了解自稳定算法的工作原理。我对他对k状态机的“解决方案”最感兴趣。纸的密度非常强烈,我无法理解它。这个算法如何用简单的英语工作?
答案 0 :(得分:10)
我可以尝试用简单的英语解释它......
首先,您应该看看link Jean-Francois Corbett写的评论。
(来自维基百科)
当且仅当:
时,系统才能自我稳定
- 从任何状态开始,都可以保证系统最终达到正确的状态(收敛)。
- 鉴于系统处于正确状态,只要没有发生故障(关闭),就可以保证系统处于正确状态。
与研讨会论文中的相同
在他的论文中,Dijkstra定义了一个自我稳定系统如下:
考虑具有N + 1个节点的圆形图。 (从0到N + 1)
每个节点可以处于不同的状态。
每个节点可以拥有不同的权限。 (例如xS = xR可以是特权)
在每个步骤中,如果在一个节点中存在特权,我们将应用某个规则:
if privilege then "what to do" endif
他将合法州定义为只有一个特权的州。
如果您在Dijkstra的论文中对所描述的系统应用不同的规则,您将获得一个自稳定系统。 (比较定义。)
即。来自任何具有n个特权的状态(即使对于一个节点具有多个特权),您将在有限数量的状态中达到仅具有一个特权的状态,并且在该状态之后保持合法状态。而且你将能够达到任何合法的状态。
你可以尝试一个简单的例子。
我们只选择一个底部节点和一个顶级节点:
starting point: (upT,xT) = (0,0) and
(upB,xB) = (1,0)
state1: (upT,xT) = (0,0) and
(upB,xB) = (1,1)
only one privilege present on B => legitimate
state2: (upT,xT) = (0,1) and
(upB,xB) = (1,1)
only one privilege present on T => legitimate
state3: (upT,xT) = (0,1) and
(upB,xB) = (1,0)
only one privilege present on B => legitimate
state4: (upT,xT) = (0,0) and
(upB,xB) = (1,0)
only one privilege present on T => legitimate
这里是3个节点的结果:bottom(0)middle(1)top(2):我从2个特权开始(不合法状态,然后一旦我进入合法状态,我就留在它里面):< / p>
{0: [True, False], 1: [False, False], 2: [False, True]}
privilege in bottom
privilege in top
================================
{0: [True, True], 1: [False, False], 2: [False, False]}
first privilege in middle
================================
{0: [True, True], 1: [True, True], 2: [False, False]}
privilege in top
================================
{0: [True, True], 1: [True, True], 2: [False, True]}
second privilege in middle
================================
{0: [True, True], 1: [False, True], 2: [False, True]}
privilege in bottom
================================
{0: [True, False], 1: [False, True], 2: [False, True]}
first privilege in middle
================================
{0: [True, False], 1: [True, False], 2: [False, True]}
privilege in top
================================
{0: [True, False], 1: [True, False], 2: [False, False]}
second privilege in middle
================================
{0: [True, False], 1: [False, False], 2: [False, False]}
privilege in bottom
... etc
这是一个小的python代码(我不是很擅长python所以它可能很丑)用n个节点的系统测试4个状态的方法,当你找到所有合法的状态时它会停止:
from copy import deepcopy
import random
n=int(raw_input("number of elements in the graph:"))-1
L=[]
D={}
D[0]=[True,random.choice([True,False])]
for i in range(1,n):
D[i]=[random.choice([True,False]),random.choice([True,False])]
D[n]=[False,random.choice([True,False])]
L.append(D)
D1=deepcopy(D)
def nextStep(G):
N=len(G)-1
print G
Temp=deepcopy(G)
privilege=0
if G[0][1] == G[1][1] and (not G[1][0]):
Temp[0][1]=(not Temp[0][1])
privilege+=1
print "privilege in bottom"
if G[N][1] != G[N-1][1]:
Temp[N][1]=(not Temp[N][1])
privilege+=1
print "privilege in top"
for i in range(1,N):
if G[i][1] != G[i-1][1]:
Temp[i][1]=(not Temp[i][1])
Temp[i][0]=True
print "first privilege in ", i
privilege+=1
if G[i][1] == G[i+1][1] and G[i][0] and (not G[i+1][0]):
Temp[i][0]=False
print "second privilege in ", i
privilege+=1
print "number of privilege used :", privilege
print '================================'
return Temp
D=nextStep(D)
while(not (D in L) ):
L.append(D)
D=nextStep(D)
答案 1 :(得分:1)
这是一款经过实战考验的自稳定库(采用非常异步设计):
https://github.com/hpc/libcircle
有关如何将Dijkstra的自稳定环纳入此库(工作队列拆分技术)的更多信息,请访问:http://dl.acm.org/citation.cfm?id=2389114。
如果您不想完成本文,那么代码也会得到很好的评论。例如,请查看:https://github.com/hpc/libcircle/blob/master/libcircle/token.c
免责声明:我是图书馆和纸张的作者。
答案 2 :(得分:0)
对于Dijkstra的自稳定环算法,您可以将每个不可区分的过程的动作划分为闭包动作和收敛动作。区分过程P0的动作是闭包动作。融合行动不参与非进展周期。对于包括P0的闭包动作,它们只能形成循环的单一权限的无限循环。如果碰巧您拥有多个权限,则关闭操作无法让它们循环。换句话说,特权的数量随着它们通过P0而逐渐减少:尊重的过程。
以下两份出版物特别有趣,除了Dijkstra在1986年的证明: 1- http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.70.976&rep=rep1&type=pdf 2- http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.27.4320&rep=rep1&type=pdf