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