Université de la Méditerranée UFR Sciences de Luminy Rapport de stage informatique pour le Master 2 de Physique, Parcours Physique Théorique et Mathématique, Physique des Particules et Astroparticules. Université de la Méditerranée (Aix-Marseille II) Stage sous la direction de A. Barrat (CPT) Propagation sur réseau statique et dynamique Boris ARM Marseille, le 28 février 2011
1 Introduction Un réseau est un ensemble d'objets modelisé par des points qui sont reliés les uns avec les autres. L'étude des réseau dynamique permet de modeliser et de comprendre les phénomènes naturels tels que les propagation d'épidemies, les propagations d'informations sur des réseaux existant dans la nature. La propagation se fait par contact entre un points non infecté et un point infecté. Un patient 0 est à l'origine de cette propagation. Ces réseaux peuvent être soit dynamique (qui varient au cours du temps) soit au contraire statique. Dans ce travail, nous rendrons compte d'une étude basée sur une propagation d'un message lors d'une conférence composée d'individus. Dans la première partie nous verrons les réseaux dynamiques dans la deuxième, es réseaux dynamiques. Pour ce travail, j'ai utilisé un compilateur fortran nommé Force 3.0, la modelisation informatique de la propagation sont des chiers timelinecontact qui à chaque temps décrivent tous les contacts présents à ce moment. 2 nombre d'infections Le premier programme consiste à calculer le nombre de personne ayant été infectée N en fonction du temps. L'algoritme consite à faire une boucle de un jusqu'au nombre de lignes du chiers décrivant chaque contact à chaque instant. À chaque instant diérent on calcul le nombre de nouveau points inecté et on l'additionne avec le nombre de points infectés du moments précédent. Figure 1 Nombre de points infectés en fonction du temps En outre, pour qu'un point soit infecté, il sut que l'un des deux points en contact soit déjà infecté alors que si aucun des deux ne sont infectés ou tous les deux sont infectés alors il ne se passe rien. Donc l'algoritmhe pour chaque instant calcule le nombre de points infectés et l'additionne au nombre de points infectés au moment précédent. Lorsqu'il change de moments il ecrit sur le chier de sortie le moment précédents et le nombre de points infectés au moment précédent. On trace ensuite la courbe du nombre de points infecté en fontion du temps (cf gure 1). On peut remarquer qu'il y des moments 2
où l'information ne se propage pas (la nuit, les pauses..) et des moments où au contraire elle se propage très vite (pendant les reprises). 3 Propagation sur réseau dynamique Un réseau dynamique est donc un réseau dont les contacts changent au cours du temps. On peut en s'en faire une image comme ceci sur quelques points. Pour calculer les distances entre tous les points il faut d'abord un Figure 2 Exemple de propagation sur réseau dynamique programme qui calcule tous points infectés au cours de la propagation (programme points). Pour cela, on fait une boucle sur le nombre de ligne du chier d'entrée timelinecontact et on dit d'inscrire sur un chier de sortie (points entrants) chaque points qui est infectés par un contact avec un autre points infectés sachant que le patient 0 est à l'origine de la propagation. On sait qu'un point i est infecté ou pas par la valeur 1 ou 0 dans la ième case d'un tableau à une colonne b. Ensuite dans un autre programme distance, on prend en entrée ce chier points entrants que l'on rentre dans un tableau d'une colonne a et on initialise un autre tableau d'une colonne b. On lit ensuite la première ligne du chier timelinecontact et on eectue une double boucle pour calculer toutes les distance entre tous les points a(i) et a(j). On initialise une variable d et le tableau b, on pose dans le tableau b que le premier points de la première ligne du chier timelinecontact est infecté (donc b(premierpoint)=1). On eectue une boucle tant que le point a(j) n'a pas été infecté (b(a(j))=1) et on fait se propager l'infection en même temps (on met des valeurs dans b égales à 1 à chaque fois qu'un nouveau points est infectés par un autre point déjà infecté sachant que le patient 0 est à l'origine de la propagation). Ensuite quand le points a(i) est trouvé dans timelinecontact, on se décale au moment suivant dans ce chier et on réinitialise le tableau b pour recommencer la propagation de l'infection à partie du moment où a(i) à été trouvé jusqu'à ce que le point que l'on trouve que a(j) soit infecté (avec une boucle do while). À chaque fois que le programme lit une nouvelle ligne qui a un temps diérent de la ligne d'avant et qui a un nouveau point infecté (t diérent de k), on incrémente un compteur d qui est la distance dynamique juqu'à ce que le point que l'on cherche a(j) soit infecté. On sort alors de la boucle do while et on écrit la distance dynamique dans un chier de sortie distance. Ensuite un autre programme (nombredefoispoint) qui prend en entré le chier distance calcule le nombre 3
de fois que chaque distance apparaîssent et écrit dans un chier de sortie (P) le nombre de fois qu'apparaissent les distance en fonction des distances. Dans un autre chier de sortie (nombredefoispoints), il écrit le nombre de points infecté N pour chaque distance ce qui revient à faire la somme des P sur les distance inférieures à celle que l'on cherche. Pour ce faire on fait une boucle sur le nombre de points et on initialise un tableau d'une colonne nombredynamique. On fait lire ensuite le chier distance en entrée puis on fait une boucle sur le nombre de points et on lis à chaque fois la distance dans le chier distance dynamique ddyn et on incrémente la ddyn ième case du tableau nombredynamique à chaque fois que la distance dynamique ddyn apparaît. Quand la boucle est nit, on en fait une deuxième sur ddyn allant de 1 au nombre de points pour écrire les valeurs de la distance dynamique ddyn et nombredynamique(ddyn) (qui correspond à P), à condition qu'elle ne soit pas nulle, et à chaque fois une autre variable k qui prend le cumul des nombredyn sur toutes les distances dynamiques précédentes que l'on af- che enn dans un autre chier N. On trace ensuite N et P en fonction des distances : Figure 3 fréquence des diérentes distances dynamique entre les points Figure 4 nombre de points infectés en fonction des distances dynamiques On peut s'apercevoir en regardant la gure 6 que la distance dynamique moyenne est de l'ordre de 15 dans un réseau ayant 405 points. 4 Propagation sur réseau statique Le réseau statique est la somme des contacts entre les diérents points produits par le réseau dynamique. Ce réseau ne bouge donc pas dans le temps. On peut l'illustrer dans un exemple : Dans la gure 5 le chemin dynamique est le chemin parcourue par les gros pointillés alors que le chemin 4
Figure 5 Comparaison réseau dynamique versus statique statique est celui parcourue par les petits pointillés sur des contacts qui n'existent pas au moment de la propagation dynamique. La distance statique est donc de fait plus petite que la distance dynamique. Pour calculer la distance statique, le programme distanceagreger prend en entrée le chier timelinecontact et initialise deux tableau b et c à une colonne et un tableau reseau à 9999 lignes et 9999 colonnes. On dit comme dans les cas précédents que le b(patient0)=1 et on initialise la variable qui représente le nombre de points nbpoints=0. On construit ensuite le réseau dynamique en faisant une boucle sur le nombre de ligne de timelinecontact et en lisant à chaque fois sur ce chier la contamination de j par i. Ceci se traduit dans le programme par une condition sur le fait que i doit être contaminé (b(i)=1) alors on pose reseau(i,j)=1 pour modeliser ce contact contaminant entre les deux points, et inversement si j contamine i. On incrémente au passage la variable nbpoints chaque fois qu'un contact contaminant se fait,on marque le point infecté i dans un chier points entrants et on pose b(i)=1 pour signier qu'il a été infecté. En faisant ceci sur tous les contact, on obtient le réseau agrégé constitué de tous les contacts entre tous les points ainsi que le nombre. En parcourant ainsi une colonne j de reseau(i,j) on peut donc connaître tous les points avec lesquels est en contact j. On rentre tous les points infecté dans un tableau a à une colonne pour avoir la liste de points en faisant une boucle et en lisant sur le chier pointsentrants la valeur de a(i). On fait ensuite une double boucle sur i et j allant de 1 au nombre de points si i est égale à j on retourne la valeur 0 dans un chier de sortie distanceagreger. Sinon on réinitialise des variables ntot et trouve à 0, nb et di à 1. On rentre dans la première case d'un tableau à une colonne les points a(i) dont on cherche la distance avec a(j). L'idée de l'algorithme est alors de chercher tous les voisins de a(i) ( voisins de distance 1), ensuite les voisins des voisins de a(i) (voisins de distance 2), et ensuite les voisins des voisins des voisins de a(i) (voisins de distance 3)... jusqu'à ce que l'on trouve le point a(j). Ceci ce modélise algorithmiquement en faisant une boucle tant que la variable touve n'est pas 1. Dans cette boucle on initialise à chaque fois le tableau b dont on posera la ligne a(i) égale à 1 car a(i) est le points dont l'on part et une variable k=0. On eectue ensuite une boucle sur m qui varie de 1 jusqu'à nb le nombre de point de distance di puis une autre boucle sur n allant de 1 à 9999 pour parcourir une colonne de reseau(c(m), n). On fait une condition pour que c(m) ne soit pas égale à n an de ne pas revenir en 5
arrière dans l'arborescence et une autre condition si on trouve un voisin à c(m) (reseau(c(m),n)=1). Dans cette dernière condition, on met une dernière condition pour que n ne soit pas déjà infecté (b(n) diérent de 1). Si toutes ces conditions sont vériées, on incrémente la variable k qui est le nombre de voisin de distance di. On note en suite ce point dans un tableau d qui est la liste des point de rang di, on dit que n a été infecté ce qui revient à poser b(n)=1. Et ensuite si ce n est égale à a(j) dont on cherche la distance avec a(i), alors on note dans un chier de sortie distanceagreger la distance di et on pose trouve=1 pour sortir de la boucle tant trouve=0 et ainsi changer de j. Sinon on met tous les voisins de distance di qui sont dans le tableaux d dans les voisins de distance di-1, qui sont dans le tableaux c. On incremente di et on pose le nb le nombre de voisins de distance di reliés à c(m) égale au nombre de voisins de distance d, k (nb=k), on additionne ntot et nb car ntot représente le nombre de voisins de distance d-1. Il faut donc mettre une condition lorsque m est égale au dernier voisin de rang d-1 pour qu'il change de nombre nb qui devient ntot et initialise ntot à 0. Tout ceci jusqu'à ce que l'algorithme trouve a(j) (trouve=1) et ceci pour tous les poins a(i). On trouve ensuite grâce au programme décrit dans la partie précédente la fréquence de distribution des distances ainsi que le nombre de points infectés en fonction des distances. Figure 6 fréquence des diérentes distances statiques entre les points On s'aperçoit que la distance statique moyenne est de l'ordre de 6. Figure 7 nombre de points infectés en fonction des distances statiques 6
Références [1] What's in a crowd? Analysis of face-to-face behavioral networks L. Isella, J. Stehlé, A. Barrat, C. Cattuto, J.-F. Pinton, W. Van den Broeck, J. Theor. Biol. 271 (2011) 166-180. [2] On the Dynamics of Human Proximity for Data Diusion in Ad-Hoc Networks A. Panisson, A. Barrat, C. Cattuto, G. Ruo, R. Schifanella A Algorithme pour calculer le nombre de points infectés en fonction du temps program nombre dimension a(9999) parameter(debut=1244098276,nbligne=76892,patient0=1537) open (10,le='timeline_contacts_sfhh.dat') open (13,le='nombre_sfhh.dat') do i=1,9999 a(i)=0 m=0 l=debut a(patient0)=1 do i=1,nbligne read(10,*) k, o, j if(k.eq.l) then if(a(o).eq.1) then if(a(j).eq.0) then m=m+1 a(j)=1 else if(a(j).eq.1)then m=m+1 a(o)=1 else write(13,*)l-debut, m if(a(o).eq.1) then if(a(j).eq.0) then m=m+1 7
a(j)=1 else if(a(j).eq.1)then m=m+1 a(o)=1 l=k write(13,*) l-debut,m close(13) B algoritme points program points_sfhh implicit integer(a-z) dimension a(9999) parameter(nbligne=76892,nbpoints=386) open (12,le='timeline_contacts_sfhh.dat') open (14,le='pointsentrants.dat') open (15,le='pointsortants.dat') do i=1,9999 a(i)=0 do i=1,nbligne read(12,*) k, o, j if(a(o).eq.0) then a(o)=1 write(14,*)o write(15,*)o if(a(j).eq.0) then a(j)=1 write(14,*)j write(15,*)j 8
close(12) close(13) close(14) close(15) end close(10) C algorithme distance program distance implicit integer(a-z) parameter(nbligne=76892,nbpoints=386,debut=1244098276, 8 n=1244213236,patient0=1537) dimension a(nbpoints), b(9999) open (13,le='distance_sfhh.dat') open (14,le='pointsentrants.dat') open (12,le='timeline_contacts_sfhh.dat') do i=1,nbpoints read(14,*) a(i) do i=1,9999 b(i)=0 la=1 read(12,*)k,l,m do i=1,nbpoints do j=1,nbpoints d=0 do w=1,9999 b(w)=0 b(patient0)=1 do while(b(a(i)).ne.1) 9
if (a(i).eq.m) then c=l l=m m=c goto 91 read(12,*)k,l,m if(b(l).eq.1) then if(b(m).eq.0) then b(m)=1 else if(b(m).eq.1)then b(l)=1 91 do r=1,9999 b(r)=0 d=0 t=k b(l)=1 if(a(j).eq.m) then d=d+1 goto 92 if(a(i).eq.a(j))then d=0 goto 92 do while (t.eq.k) t=k 10
read(12,*)k,l,m d=d+1 do while(a(j).ne.m) if (a(j).eq.l) then c=l l=m m=c goto 92 read(12,*)k,l,m if (k.eq.n) then goto 92 if(b(l).eq.1) then if(b(m).eq.0) then if (t.ne.k) then d=d+1 b(m)=1 else if(b(m).eq.1)then if (t.ne.k) then d=d+1 b(l)=1 t=k 92 write(13,*) d la=la+1 close(12) 11
open (12,le='timeline_contacts_sfhh.dat') close(14) close(13) end end D algoritme distanceagreger program distanceagreger implicit integer(a-z) parameter(nbligne=76892,debut=1244098276, 8 n=1244213236, patient0=1537) dimension a(9999), b(9999),c(9999),d(9999), 3 reseau(9999,9999),distance(9999,9999) open (13,le='distanceagreger_sfhh.dat') open (14,le='pointsentrants.dat') open (12,le='timeline_contacts_sfhh.dat') do i=1,9999 c(i)=0 do i=1,9999 b(i)=0 do i=1,9999 do j=1,9999 reseau(i,j)=0 b(patient0)=1 nbpoints=0 do i=1,nbligne 12
read(12,*) k, o, j if(b(o).eq.1) then if(b(j).eq.0) then reseau(o,j)=1 b(j)=1 write(14,*)j nbpoints=nbpoints+1 else if(b(j).eq.1)then reseau(j,o)=1 b(o)=1 write(14,*)o nbpoints=nbpoints+1 close(14) open (14,le='pointsentrants.dat') do i=1,nbpoints read(14,*)a(i) do i=1,nbpoints do j=1,nbpoints if(a(i).eq.a(j))then trouve=1 write(13,*) 0 goto 81 trouve=0 ntot=0 nb=1 13
c(1)=a(i) di=1 do while(trouve.ne.1) if(a(i).eq.a(j))then trouve=1 write(13,*) 0 goto 81 do m=1,9999 b(m)=0 b(a(i))=1 k=0 do m=1,nb do n=1,9999 if(c(m).ne.n)then if(reseau(c(m),n).eq.1) then if(b(n).eq.0)then k=k+1 d(k)=n b(n)=1 if(n.eq.a(j))then distance(i,j)=di write(13,*)di trouve=1 goto 81 do m=1,k c(m)=d(m) di=di+1 nb=k ntot=ntot+nb if(m.eq.nb) then nb=ntot ntot=0 14
81 write(13,*)'c est la n' close(14) close(13) end 15