波动算法-环网算法、树算法和回波、轮询算法

1、环网算法

一个确定的哈密乐顿回路被编码到进程中,假设对于每个进程p,给定它的一个专门的近邻Nextp,满足以这种方式选择的所有信道形成一个哈密尔顿回路。初始进程沿着回路发送消息<tok>,每个进程传递消息,当消息回到初始进程,初始进程进行判定。

for the initiator:

     begin send <tok> to Nextp;receive(tok);decide end

for non-initiators:

     begin receive <toke> ;send <tok> to Nextp end

2、树算法

如果网络的生成树是可用的相同的算法可被用于任意网络。如果进程经过依附它的每个信道接收一条消息,队了一种情况(初始时,这个条件对叶节点成立),则进程经过其余信道发送消息。如果进程经过所有依附的信道接收消息,则它进行判定。

var recp[q] for each q∈Neighp:boolean init false;

(*recp[q] is true if p has received a message from q*)

 

begin while #{q:recp[q] is false}>1 do

           begin receive <tok> from q;recp[q]:=true end;

          (*now there is one q0 with recp[q0] is false*)

          send <tok> to q0 with recp[q0] is false;

         x:receive <tok> from q0;recp[q0]:=true;

          decide

          (*Inform other processes of decision:

           forall q∈Neighp,qq0 do send <tok> to q*)

end

3、回波算法

将消息扩散到所有进程中,定义了一棵生成树,令牌沿着这棵树边上的回声返回,就像树网算法中的消息流。初始进程向所有它的近邻发送消息。一旦接到第一条消息,非初始进程就把消息转发给它的所有近邻,除了它收到消息的那个近邻。当非初始进程收到来自于所有近邻的消息时,就向它的父节点发送回波。当初始进程收到所有近邻的消息时,就进行判定。

var recp:integer init 0;

      fatherep:P   init udef;

 

for the initiator:

        begin forall q∈Neighu do send <tok> to q;

        while recp<#Neighp do

                 begin receive <tok>;recp:=recp+1 end;

       end

 

for non-initiators:

     begin receive <tok> from neighbor q;fatherp:=q;recp:=recp+1;

            forall q∈Neighp,q≠fatherp do send <tok> to q;

            while recp>#Neighp do

                      begin receive <tok>;recp:=recp+1 end;

            send <tok> to fatherp

   end

4、轮询算法

经依附于初始进程的每条信道,算法发送2条消息。初始进程的每个近邻对于原始轮询只应答一次。可用于星型网络,中心就是初始进程。

var recp:integer init 0;(*for initiator only*)

for the initiator:

      begin forall q∈Neighp do send <tok> to q;

                while recp<#Neighp do

                         begin receive <tok>;recp:=recp+1 end;

                decide

      end

 

for non-initiators:

      begin receive <tok> from q;send <tok> to q end

你可能感兴趣的:(算法)