分布式计算-Korach-Kutten-Moran算法选举算法

1、用级的概念代替轮的概念,仅当地2个令牌具有相同的级时,它们将引起新的遍历。新产生的令牌高出一级。如果令牌遇到高一级的令牌,或到达已被高一级令牌访问的节点,到达的令牌则简单地被杀死,而不影响更高一级的令牌。

2、每个令牌牌三种模式之一:合并(annex)、追赶(chase)、等待(wait)。

3、用(q,l)表示令牌,其中q表示令牌的初始进程,l表示它的级别。

4、lastp用于处于追赶模式的令牌,trav函数为遍历算法作用函数,返回令牌必须被转发到的近邻。

5、

var levp :integer init -1;

      catp,waitp:P init udef;

      lastp:Neighp init udef;

     

begin if p is initiator then

          begin levp:=levp+1;lastp:=trav(p,levp);

                    catp:=p;send <annex,p,levp> to lastp

         end;

      while .....(*终止条件*) do

              begin receive token (q,l);

                  if token is annexing then t:=A else t:=C;

                  if l>levp then (*Case I*)

                       begin levp:=l;catp:=q;

                                 waitp:=udef;lastp:=trav(q,l);

                                 send <annex,q,l> to lastp

                       end

                else if l=levp and waitp≠pudef then (*Case II*)

                           begin waitp:=udef;levp:=levp+1 ;lastp:=trav(p,levp);catp:=p;

                                     send <annex,p,levp> to lastp

                          end

                else if l=levp and lastp=udef then(*Case III*)

                       waitp:=q

                else if l=levp and t=A and q=catp then (*Case IV*)

                      begin lastp:=trav(q,l);

                                if lastp=decide

                                  then p annouces itself leader

                                  else send <annex,q,l> to lastp

                     end

                 else if l=levp and ((t=A and q>catp)or t=C) then (*Case V*)

                           begin send  <chase,q,l> to lastp;lastp:=udef end

                 else if l=levp then (*Case VI*)

                         waitp:=q

         end

end

 

你可能感兴趣的:(C++,c,算法,C#)