Note: Pour tracer et générer les graphes, on utilisera la librairie igraph dont documentation est disponible à http://igraph.org/r/doc/
On se donne un graphe d’interférence \(G=(V,E)\) à \(n=|V|\) sommets. Un sommet \(v\in V\) correspond à un éméteur wifi. La présence d’une arrête \((v,t)\in E\) indique que \(v\) et \(t\) ne peuvent pas émettrent en même temps (à cause des interférences générées).
Dans ce projet, on veut étudier le modèle suivant (qui est une approximation du protocole de communication CSMA). Chaque noeud est dans un état actif / non-actif. Initialement, tous les noeuds sont inactifs.
A chaque pas de temps, un noeud est choisit au hazard. - s’il est inactif, il devient actif avec probabilité \(p\in(0,1)\). - s’il est actif, il devient inactif avec probabilité \(q\in(0,1)\)
On note \(X_i(t)\in\{TRUE,FALSE\}\) une variable valant \(TRUE\) si le sommet \(i\) est actif à l’instant \(t\) et \(X(t)=(X_1(t)\dots X_n(t))\) le vecteur d’activation. On note \(N(t)\) le nombre de sommets actifs à l’instant \(t\).
On considère deux graphes d’intéractions suivants: une ligne à \(n\) sommets et une étoile à de \(n\) sommets. On répondra à toutes les questions en prenant \(n=4\) sommets.
Le processus \(X\) est-il une chaîne de Markov? Le processus \(N\) est-il une chaîne de Markov? (justifier)
Une configuration possible est un vecteur pouvant être atteint par la chaîne de Markov en partant de l’état \((0,0\dots,0)\).
Pour chacun des graphes, donner l’ensemble des configurations possibles et tracer le graphe de transition (pour \(n=4\))?
La chaîne \(X\) est-elle irréductible? Apériodique?
On note \(\rho=p/q\). Exprimer la mesure stationnaire \(\pi_\rho\) en fonction de \(\rho\) (pour l’étoile et la ligne)
Vers quoi converge la loi \(\pi_\rho\) lorsque \(\rho\to0\) et \(\rho\to\infty\)?
Pour chacun des deux graphes ci dessus, quelle est la proportion du temps pendant laquelle le sommet \(1\)Ă©met? MĂŞme question pour le sommet \(2\).
On cherche maintenant à étudier le protocole sur un graphe général.
En se servant du fait que le processus est réversible, exprimer la probabilité stationnaire d’une configuration en fonction de \(\rho\).
Quelle est la loi limite lorsque \(\rho\) tend vers \(0\) ou \(\infty\)?
set.seed(42)
graphe_random = function (n){return(sample_grg(n, .2, torus=FALSE, coords = TRUE))}
n = 50
p = 0.5
q = 0.5
g = graphe_random(n)
plot(g)
Une allocation est un vecteur de \(0\) et de \(1\). La fonction “are_adgacent(g,v1,v2)” permet de tester si v1 et v2 sont voisins dans le graphe \(g\).
are_adjacent(g,1,2)
## [1] TRUE
Une allocation est un vecteur de \(\{0,1\}\). On se donne la fonction suivante permettant de tracer une allocation.
plot_graphe= function(g,X){
plot(g,vertex.color=sapply(X,function(x) ifelse(x,'green','red')))
}
X = rep(0,n);
X[c(3,29,30)] = TRUE
plot_graphe(g,X)
simulateur = function ( g, p, q, T ){
n = length(g)
X = matrix(0,T,n)
N = rep(0,T)
for (t in (2:T)){
X[t,]=X[t-1,]
## CODE POUR MODIFIER X[t,] ICI
##
N[t] = sum(X[t,])
}
return(list(X,N))
}
Pour chaque simulation, on fera attention au choix du temps de simulation \(T\). A chaque fois, on comparera une valeur de \(\rho\) petite (par exemple \(\rho=1\)) et une valeur de \(\rho\) grande (par exemple \(\rho=10\)).
Le code suivant montre comment on peut visualiser le résultat d’une simulation:
Tracer \(X_1(t)\) et \(X_2(t)\) en fonction du temps. Commenter.
Tracer \(X_i(t)\) en fonction du temps pour plusieurs valeur de \(i\) que vous choisirez. Tracer \(N\) en fonction du temps. Commenter.
Que pensez vous de l’impact de \(\rho\) sur le protocole (en terme d’efficacité et d’équité entre les différents utilisateurs)
graphe = function(N,c){
X = runif(N)
Y = runif(N)
plot(X,Y)
M = matrix(FALSE,N,N)
for (i in 1:N) {
for (j in 1:N) {
M[i,j] = (X[i]-X[j])**2 + (Y[i]-Y[j])**2 < c
}
}
return(list(X,Y,M))
}
g = graphe(100,.05)
M = g[[3]]
plot_graphe= function(g){
X = g[[1]]
Y = g[[2]]
M = g[[3]]
plot(X,Y)
for (i in 1:100){
for (j in i:100){
if (M[i,j]){
lines(X[c(i,j)],Y[c(i,j)])
}
}
}
}
plot_allocation= function(g,alloc){
X = g[[1]]
Y = g[[2]]
plot_graphe(g)
for (i in 1:100){
if (alloc[i]){
points(X[i],Y[i],col="red")
}
}
}
plot_graphe(g)
plot_allocation(g, runif(100)<.1)