• Aucun résultat trouvé

2.3 Algorithmes de construction de la structure CBL

2.3.6 Traitement type branche (algorithme 4)

Un nœud branche participe `a la cr´eation d’une chaˆıne : il ´elit, parmi ces nœuds branche voisins circulant dans la mˆeme direction, un nœud branche en amont (NAR) et un nœud branche (NAV) en aval

de sa position si celui-ci l’a ´elu. L’adresse de ces nœuds est enregistr´ee respectivement dans ses variables locales @ChainDO et @ChainUP et ces informations sont ensuite partag´ees avec ses voisins `a un saut par l’interm´ediaire des messages HELLO qu’il ´emet. La strat´egie propos´ee dans CBL est celle-ci : un nœud branche se rattache au premier nœud branche qu’il d´etecte en amont de sa position. Cependant, il arrive qu’il en d´etecte plusieurs ou, au contraire, n’en d´etecte pas.

• S’il en d´etecte plusieurs et qu’il n’a pas encore averti ses voisins de son choix, alors le nœud branche qui se d´eplace dans la mˆeme direction, qui fait partie d’une chaˆıne, qui offre le plus long temps de chaˆıne (ChainT ime) et dont le degr´e est le plus ´elev´e est ´elu.

• S’il n’en d´etecte aucun, apr`es une p´eriode d’attente de C2 ∗ HELLO INT ERV AL, le nœud ´elit, pour nœud branche amont, le nœud feuille qui r´epond aux mˆemes crit`eres que pr´ec´edemment. Cette ´election d’un nœud feuille au titre de nœud branche prolonge la chaˆıne d’un maillon.

Lorsque le nœud branche a ajout´e un maillon `a sa chaˆıne, il ne modifie plus son choix tant que l’ordonnan- cement spatial des v´ehicules amont et aval relativement `a ce nœud branche n’a pas subi de permutations.

La proc´edure de l’algorithme 4 ex´ecut´ee par un nœud branche Ni est la suivante :

• Tout d’abord, si Ni a d´ej`a choisi un nœud branche amont ou aval auquel se rattacher, il contrˆole

que leurs informations ne sont pas obsol`etes (respectivement variables T2 ou T3). Si elles le sont, il l’invalide au titre de nœud branche amont respectivement aval (lignes 2-11).

• Puis, Ni compare l’adresse du nœud exp´editeur avec celles contenues dans ses champs @ChainDO

et @ChainUP. Si cette adresse est identique `a @ChainDO (respectivement @ChainUP), Ni v´erifie

que le voisin qui envoie le message l’a ´elu dans sa chaˆıne (@HELLO.ChainUP respectivement, @HELLO.ChainDO). Si le voisin a ´elu un autre nœud alors Ni l’invalide au titre de nœud branche

amont, respectivement aval (lignes 2-11).

• Ensuite, Nicompare l’adresse du nœud exp´editeur avec celles contenues dans ses champs @ChainDO

et @ChainUP. Si l’une d’elles est identique `a un des deux champs, Nicontrˆole, via les informations du

message re¸cu avec la fonction ChainChangeNode, si ce nœud voisin est encore un nœud branche, dans sa direction de circulation et que leurs positions relatives n’ont pas permut´ees (d´epassement de l’un des v´ehicules). Si ces trois conditions sont r´eunies, Nimet `a jour ses variables locales associ´ees

T7, T10 et DegreeChainUP) (lignes 14-21). Sinon, il l’invalide au titre de nœud branche de sa chaˆıne (lignes 22-38). Si l’adresse du nœud exp´editeur est celle du champ @ChainDO et que ce nœud se situe maintenant en aval, Ni l’invalide en tant que maillon de chaˆıne. Si Ni constate que, dans sa

table des voisins, il a connaissance du nœud branche en amont qu’avait choisi le nœud exp´editeur, que ce voisin est effectivement un nœud branche et, enfin, que leur liaison est sym´etrique depuis au moins V time, alors il le s´electionne au titre de nœud branche amont (lignes 27-31).

• Puis, Niv´erifie si son nœud branche choisi en amont, a un temps de connexion inf´erieur au seuil L3∗

HELLO INTERVAL(lignes 39-47). Dans ce cas, la liaison avec ce nœud amont va devenir caduque. Niinitie une recherche proactive d’un nouveau nœud relais amont de la chaˆıne. Si le nœud voisin qui

envoie le message HELLO est en amont, dans sa direction et apporte la connaissance de nouveaux voisins, alors Ni le choisit et met `a jour ses variables internes (T2, T6, T9 et DegreeChainDO).

• Puis, Nieffectue la mise `a jour de la variable locale T1 et du champ “Elected”, de sa table des voisins

associ´ee `a l’adresse du nœud exp´editeur si son adresse @Nifigure dans l’un des champs @ChainDO,

@ChainUP ou @BrancheChoice du message HELLO du nœud exp´editeur (lignes 48-53). Si son adresse est absente de ces champs la valeur du champs “Elected” est mise `a z´ero.

• Lorsque le nœud exp´editeur Nj du message HELLO est un nœud branche, Ni prend connaissance

de la position relative de ce nœud Nj par rapport `a lui-mˆeme.

Si Nj est en aval et qu’il a s´electionn´e Ni dans sa chaˆıne alors Ni le s´electionne en retour comme

maillon de chaˆıne aval (lignes 76-82). Si Ni n’a pas de maillon de chaˆıne dans la direction de ce

nœud en amont, il le choisit comme maillon ; il met alors `a jour ses variables locales temporelles (T2, T6 et T9) (lignes 57-60). Si, par contre, Ni avait ant´erieurement s´electionn´e un nœud Nk en

amont comme maillon et que Nj est ´egalement en amont, deux cas de figure se pr´esentent :

− si le nœud Nk est en bout de chaˆıne et si le nœud exp´editeur Nj n’est pas un maillon isol´e

alors Ni s´electionne Nj comme maillon en amont ; il met ensuite `a jour ses variables locales

temporelles (T2, T6 et T9) lignes 61-64 ;

− sinon, si Nin’a pas encore diffus´e le choix du nœud Nk, il compare son choix ant´erieur Nk avec

la fonction CompareChainNode `a l’aide des coefficients L2 et α avec le nœud exp´editeur Nj conform´ement `a la section 2.2.8. Si Nj est un meilleur candidat, alors Ni s´electionne Nj

comme maillon en amont ; il met ensuite `a jour ses variables locales temporelles (T2, T6 et T9) (lignes 65-71).

• Lorsque le nœud exp´editeur Nj du message HELLO est un nœud feuille, alors, une fois la p´eriode

C2 ∗ HELLO INTERVALd’observation du voisinage ´ecoul´ee, Ni prend connaissance de la position

relative de ce nœud Nj par rapport `a lui-mˆeme . Ensuite, si Ni n’a pas de maillon de chaˆıne en

amont, il le choisit comme maillon ; il met alors `a jour ses variables locales temporelles (T2, T6 et T9). Si, par contre, Niavait ant´erieurement s´electionn´e un nœud feuille Nk comme maillon dans la

direction du nœud exp´editeur en amont, et s’il n’a pas encore diffus´e son choix de nœud Nk, il r´ealise

les actions suivantes : il compare son choix ant´erieur Nk avec la fonction CompareChainNode `a

l’aide des coefficients L2 et α avec le nœud exp´editeur Nj conform´ement `a la section 2.2.8. Si Nj

est un meilleur candidat, alors Ni s´electionne Nj comme maillon en amont ; il met ensuite `a jour

Algorithm 4 Traitement type branche

1: procedure Branch Processing(Ni,Nj)

2: if [T > T 2 + V time AND @ChainDO.Ni! = 0 ]OR [@ChainDO.Ni == @Nj AND

@HELLO.ChainUP.Nj! = @Ni AND @HELLO.ChainUP.Nj! = 0] then

3: @ChainDO.Ni← 0 .Perte du nœud branche arri`ere 4: DegreeChainDO.Ni← 0

5: [T2, T6, T9] ←[0, T, 0]

6: end if

7: if [T > T 3.Ni + V time AND @ChainUP.Ni! = 0 ] OR [@ChainUP.Ni == @Nj AND

@HELLO.ChainDO.Nj! = @Ni AND @HELLO.ChainDO.Nj! = 0] then

8: @ChainUP.Ni ← 0 . Perte du nœud branche avant 9: DegreeChainU P.Ni ← 0

10: [T3, T7, T10] ←[0, T, 0] 11: end if

12: if @Nj == @ChainU P.Ni OR @Nj== @ChainDO.Ni then 13: [Flag, ChoiceUP, ChoiceDO] ← ChangeChainNode(Ni, Nj)

14: if F lag == 0 then .Pas de modification dans la chaˆıne

15: if @ChainDO.Ni== @Nj then 16: [T2, T6] ←[T, 0] 17: DegreeChainDO.Ni← NumberNewNeighbors(Ni,Nj) 18: else 19: [T3, T7] ←[T, 0] 20: DegreeChainU P.Ni← NumberNewNeighbors(Ni,Nj) 21: end if

22: else .Modification dans la chaˆıne

23: if ChoiceDO == 0 then

24: @ChainDO.Ni← 0 .Perte du nœud branche arri`ere 25: DegreeChainDO.Ni← 0

26: [T2, T6, T9] ←[O, T, 0]

27: else

28: @ChainDO.Ni← ChoiceDO .Changement du nœud branche arri`ere 29: DegreeChainDO.Ni← 0

30: [T2, T6, T9] ←[T, 0, T] 31: end if

32: if ChoiceU P == 0 then

33: @ChainUP.Ni← 0 . Perte du nœud branche avant 34: DegreeChainU P.Ni← 0

35: [T3, T7, T10] ←[O, T, 0] 36: end if

37: end if

38: end if

39: if @ChainDO.Ni! = 0 AND RelativePosition(Ni,Nj)==1 AND |σNj− σNi| < σmax then 40: if CT(Ni,@ChainDO.Ni)<L3 ∗ HELLO INTERVAL then . Perte imminente du nœud

branche arri`ere 41: if CompareChainNode(Nj,∅)==1 then 42: @ChainDO.Ni← Nj 43: DegreeChainDO.Ni← NumberNewNeighbors(Ni,Nj) 44: [T2, T6, T9] ←[T, 0, T] 45: end if 46: end if 47: end if

48: if @Ni ∈ {@HELLO.ChaineU P.Nj, @HELLO.ChaineDO.Nj, @HELLO.BranchChoice.Nj}

then . Nj branche

49: Elected.Ni(Nj) == 1 .Mise `a jour de la variable Elected 50: T 1 ← T

51: else

52: Elected.Ni(Nj) ← 0 53: end if

54: if T ype.Nj== 1 then . Nj branche

55: if RelativePosition(Ni,Nj)==1 AND |σNj − σNi| < σmax then 56: if @HELLO.ChainUP.Nj = 0 OR@Ni==@HELLO.ChainUP.Nj then 57: if @ChainDO.Ni== 0 then

58: @ChainDO.Ni← Nj . Nj derri`ere Ni est dans la mˆeme direction 59: DegreeChainDO.Ni ← NumberNewNeighbors(Ni,Nj)

60: [T2, T6, T9] ←[T, 0, T]

61: else if @HELLO.ChainDO.Nj! = 0AND @N.ChainDO(ChainDO.Ni)==0 then 62: @ChainDO.Ni← Nj . Nj fait partie d’une chaˆıne 63: DegreeChainDO.Ni ← NumberNewNeighbors(Ni,Nj)

64: [T2, T6, T9] ←[T, 0, T] 65: else if T 5 < T 9 then

66: Nk← @ChainDO.Ni . Ni n’a pas averti son voisinage 67: if CompareChainNode(Nj, Nk)==1 then

68: @ChainDO.Ni← Nj . Nj est un meilleur candidat que Nk 69: DegreeChainDO.Ni← NumberNewNeighbors(Ni,Nj) 70: [T2, T6, T9] ←[T, 0, T] 71: end if 72: end if 73: end if 74: end if

75: if RelativePosition(Ni,Nj)==0 AND |σNj − σNi| < σmax then 76: if @Ni==@HELLO.ChainDO.Nj then

77: if @ChainUP.Ni== 0 OR@HELLO.ChainUP.Nj=@ChainUP.Ni then

78: @ChainUP.Ni← Nj . Nj devant Ni est dans la mˆeme direction 79: DegreeChainU P.Ni← NumberNewNeighbors(Ni,Nj) 80: [T3, T7, T10] ←[T, 0, T] 81: end if 82: end if 83: end if 84: else . Nj feuille

85: if RelativePosition(Ni,Nj)==1 AND T >T 6 + C2 ∗ HELLO INTERVAL AND

[@ChainDO.Ni==0 OR (@ChainDO.Ni!=0 AND Type.@ChainDO.Ni==0 AND T 5 < T 9 )] then 86: if CompareChainNode(Nj, @ChainDO)==1 then

87: @ChainDO.Ni← @Nj .Changement du nœud branche arri`ere 88: DegreeChainDO.Ni← NumberNewNeighbors(Ni,Nj) 89: [T1, T2, T6, T9] ←[T, T, 0, T] 90: end if 91: end if 92: end if 93: end procedure

1: function [Flag, ChoiceUP, ChoiceDO]= ChangeChainNode(Ni,Nj)( Retourne Flag=0 s’il

n’y a pas de modification dans la chaˆıne ; sinon, retourne Flag=1 avec les adresses des nœuds branche amont et aval respectivement dans ChoiceDO et ChoiceUP.)

2: ChoiceUP ←@ChainUP.Ni 3: ChoiceDO ←@ChainDO.Ni 4: Flag← 0

5: if @Nj==@ChainDO.Ni AND RelarivePosition(Ni,Nj)==0) then . Ni a ´et´e d´epass´e par

Nj

6: Flag← 1 7: ChoiceDO ← 0

8: @Nk ← @HELLO.ChainDO.Nj

9: if @Nk∈ N eighborT able.Ni AND Date1.Ni(@Nk) + V time < T AND @Nk! = @NiAND

RelarivePosition(Ni,Nk)==0) AND Type.Nk==1 then 10: ChoiceDO ← @Nk

11: end if

12: break

13: end if

14: if @Nj==@ChainUP.Ni AND RelarivePosition(Ni,Nj)==1) then . Ni a d´epass´e Nj 15: Flag← 1

16: ChoiceDO ← 0 17: ChoiceUP ← 0 18: break

19: end if

20: if T ype.Nj== 1AND |σNj − σNi| < σmax then 21: Flag← 0 22: else 23: Flag← 1 24: if @Nj==@ChainDO.Ni then 25: ChoiceDO ← 0 26: else 27: ChoiceUP ← 0 28: end if 29: end if 30: end function

1: function NumberNewNeighbors(Ni,Nj)(Retourne le nombre de nouveaux voisins apport´es par

le nœud Nj pour le nœud Ni) 2: Degree ← 0

3: n ← 0

4: whilen<Size(HELLO.NeighborTable.Nj) do 5: Nk← HELLO.N eighborT able.Nj(n)

6: if Nk!=Ni then

7: if LinkType(Nj,Nk)==SYM then

8: if @Nk∈ Local.N eighborT able.N/ i then 9: Degree ← Degree+1 10: end if 11: end if 12: end if 13: n ← n + 1 14: end while 15: returnDegree 16: end function

1: function Flag=CompareChainNode(Ni,Nj,Nk)(Retourne vrai si le nœud Nj est un meilleur

candidat que Nk pour le choix de chaˆıne avant ou arri`ere.) 2: if T < Date1.Ni(Nj) + V time then

3: returnFalse .V´erification de la stabilit´e de la liaison sym´etrique Ni-Nj 4: break

5: end if

6: if NumberNewNeighbors(Ni,Nj)==0 then

7: returnFalse . Nj n’apporte pas de nouveau voisin 8: break

9: end if

10: if |σNj − σNi| >= σmax then

11: returnFalse . Nj est dans une autre direction 12: break

13: end if

14: if Nk==0 then

15: returnTrue . Nj est un meilleur candidat

16: break 17: end if

18: if Type.Nj==1 AND Type.Nk==0 then

19: returnTrue . Nj est un meilleur candidat

20: break 21: end if

22: if Type.Nk==1 AND Type.Nj==0 then 23: returnFalse

24: break 25: end if

26: if Type.Nk==1 then

27: if RelativePosition(Ni,Nj)==1) then

28: if N.ChainDO.Ni(Nj)!=0 AND N.ChainDO.Ni(Nk)==0 then

29: returnTrue . Nj est un meilleur candidat

30: break

31: end if

32: else

33: if N.ChainUP.Ni(Nj)!=0 AND N.ChainUP.Ni(Nk)==0 then

34: returnTrue . Nj est un meilleur candidat

35: break

36: end if

37: end if

38: end if

39: if ChainTime(Ni,Nj)=>L2*P/V AND ChainTime(Ni,Nk)=>L2*P/V then 40: if NumberNewNeighbors(Ni,Nj)>NumberNewNeighbors(Ni,Nk) then

41: returnTrue . Nj est un meilleur candidat

42: else

43: returnFalse

44: end if

45: else if ChainTime(Ni,Nj)=>L2*P/Vi AND ChainTime(Ni,Nk)<L2*P/Vi then

46: returnTrue . Nj est un meilleur candidat

47: else if ChainTime(Ni,Nj)<L2*P/Vi AND ChainTime(Ni,Nk)=>L2*P/Vi then

48: returnFalse . Nj est un meilleur candidat

49: else

50: Compute Mα(Nj), Mα(Nk) .Voir ´equation 2.4 51: if Mα(Nj) > Mα(Nk) then

52: returnTrue . Nj est un meilleur candidat

53: else

54: returnFalse

1: function Flag=RelarivePosition(Ni,Nj)(Retourne vrai si le nœud Nj est derri`ere le nœud Ni) 2: if cos(σNi) ∗ (Xj− Xi) + sin(σNi) ∗ (Yj− Yi) < 0 then

3: returnTrue

4: else

5: returnFalse

6: end if

7: end function

1: function Time=ChainTime(Ni,Nj)(Retourne le temps durant lequel le nœud Nj peut rester dans

la chaˆıne)

2: if [RelarivePosition(Ni,Nj)==1) AND Vj < Vi] OR [RelarivePosition(Ni,Nj)==0)

AND Vj> Vi] then 3: returnCT(Ni,Nj) 4: else 5: returnmin(CT(Ni,Nj),p(Xi− Xj)2+ (Yi− Yj)2)/|Vi− Vj|) 6: end if 7: end function

1: function CT=CT(Ni,Nj)(Retourne le temps de connexion entre le nœud Ni et Nj) 2: a ← Vi∗ cos(σi) − Vj∗ cos(σj) 3: b ← Xi− Xj 4: c ← Vi∗ sin(σi) − Vj∗ sin(σj) 5: d ← Yi− Yj 6: return −(ab+cd)+(a2+c2)∗P2−(ab−bc)2 a2+c2 7: end function