Я прочитал его оригинал, Системы самостабилизации, несмотря на распределенный контроль. Однако я не совсем понимаю, как работает алгоритм самостабилизации. Меня больше всего интересует его "решение" машин k-state. Плотность бумаги довольно интенсивная, и я не могу ее полностью понять. Как этот алгоритм работает на простом английском языке?
Как работает алгоритм самокритичности Дейкстры?
Ответ 1
Я могу попытаться объяснить это простым языком...
Сначала вы должны посмотреть ссылку Жан-Франсуа Корбетт написал в качестве комментария.
Определение
(из Википедии)
Система самостабилизируется тогда и только тогда, когда:
- Начиная с любого состояния, гарантируется, что система в конечном итоге достигнет правильного состояния (конвергенции).
- Учитывая, что система находится в правильном состоянии, гарантируется, что она останется в правильном состоянии при условии, что не произойдет никакой ошибки (закрытие).
нотации
То же, что и в документе семинара
Система самостабилизации
В своей работе Дейкстра определяет систему самостабилизации следующим образом:
Рассмотрим граф окружностей с N + 1 узлами. (От 0 до N + 1)
Каждый node может находиться в разных состояниях.
Каждый node может иметь разные привилегии. (например, xS = xR может быть привилегией)
На каждом шаге, если в одном node присутствует привилегия, мы применим определенное правило:
if privilege then "what to do" endif
Законные государства
Он определяет законное состояние как состояние, имеющее только одну привилегию.
Заключение
Если вы применяете различные правила в бумаге Дейкстра для описанной системы, вы получите систему самостабилизации. (определение cf.)
то есть. из любого состояния с n привилегиями (даже с несколькими привилегиями для одного node) вы достигнете в конечном числе состояний состояния с только одной привилегией и остаетесь в законных состояниях после этого состояния. И вы сможете достичь любого законного состояния.
Вы можете попробовать себя на простом примере.
Пример для решения четырех состояний
Возьмем только нижний node и верхний node:
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
и вот результат для трех узлов: bottom (0) middle (1) top (2): Я начинаю с 2 привилегий (не законное состояние, а затем, когда я попадаю в законное состояние, я остаюсь в нем):
{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, так что это может быть уродливо), чтобы протестировать 4 состояния с помощью системы из n узлов, он останавливается, когда вы находите все законные состояния:
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)
Ответ 2
Здесь битва протестировала библиотеку самостабилизации (с очень асинхронным дизайном):
https://github.com/hpc/libcircle
Более подробная информация о том, как само стабилизирующее кольцо Дейкстры была включена в эту библиотеку (методы разделения очереди работы), можно найти по адресу: http://dl.acm.org/citation.cfm?id=2389114.
Код также прокомментирован достаточно хорошо, если вам не нравится работать через бумагу. Например, взгляните на: https://github.com/hpc/libcircle/blob/master/libcircle/token.c
Отказ от ответственности: я являюсь автором библиотеки и бумаги.
Ответ 3
Для алгоритма самостабилизационного кольца Дейкстры вы можете разделить действия каждого не различимого процесса на действия закрытия и действия конвергенции. Действие отмеченного процесса P0 является действием закрытия. Действия конвергенции не участвуют в циклах без прогресса. Что касается действий замыкания, в том числе и для P0, они могут образовывать только бесконечный цикл циркуляции единой привилегии. Если случается, что у вас есть несколько привилегий, нет никакого способа, чтобы действия закрытия делали их циркулирующими. Другими словами, количество привилегий продолжает уменьшаться по мере прохождения через P0: выдающийся процесс.
Следующие две публикации особенно интересны, помимо доказательства Дейкстры в 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