set.seed(77)
N = 100 # Nombre de sommets dans les graphes générés
Nb = 500; # Nombre de graphes pour la simulation
Fonction de génération d’un graphe d’Erdos-renyi (par sa matrice d’adjacence et comptage du nombre de sommets isolés) Note: On considerera que les graphes d’Erdos-renyi n’ont pas de boucle (Wikipedia) donc Gij (i=j) =0
#Generer le graphe
generer_graphe = function(P){
matrice = matrix(data = 2, nrow = N, ncol = N)
for(ligne in 1:N){
for(colonne in ligne:N){
if(ligne == colonne){
matrice[ligne,colonne] = 0; #Pas de boucle
}else{
matrice[ligne,colonne] = rbinom(1,1,P); #Bernoulli
matrice[colonne,ligne] = matrice[ligne,colonne]; #Faire la symetrie
}
}
}
return(matrice)
}
#Compter les sommets isolés
nb_sommets_isoles = function(graphe){
nb_isoles = 0
for(ligne in 1:N){
compteur = 0;
for(colonne in 1:N){
compteur = compteur + graphe[ligne,colonne]
}
if(compteur == 0){
nb_isoles = nb_isoles + 1
}
else {}
}
return(nb_isoles)
}
Fonction qui crée Nb graphes aléatoire (probabilité p) et qui renvoie un tableau de Nb nombre de sommets isolés.
simulation = function(Nb, p) {
tab = 1:Nb
for (i in tab) {
tab[i] = nb_sommets_isoles(generer_graphe(p))
}
return(tab)
}
Fonction qui regarde si un graphe est connexe
est_connexe = function(g) {
if (nb_sommets_isoles(g) == 0)
{
return (TRUE)
}
else { return (FALSE);}
}
Fonction qui renvoie la proportion de graphe connexe dans un tirage de Nb graphe aléatoire
simulation_connexe = function(Nb, p) {
tab = 1:Nb
res = 0
for (i in tab) {
if (est_connexe(generer_graphe(p)))
{
res = res +1
}
}
return(res/Nb)
}
c = -4;
t = simulation(Nb, ((c+log(N))/N));
hist(t);
abline(v = exp(-c), col=c("red"))
mean(t)
## [1] 54.686
exp(-c)
## [1] 54.59815
c = -2;
t = simulation(Nb, ((c+log(N))/N));
hist(t);
abline(v = exp(-c), col=c("red"))
mean(t)
## [1] 7.002
exp(-c)
## [1] 7.389056
c = 3;
t = simulation(Nb, ((c+log(N))/N));
hist(t);
abline(v = exp(-c), col=c("red"))
mean(t)
## [1] 0.034
exp(-c)
## [1] 0.04978707
On voit que \[e^{-c}\] est une bonne estimation. On retrouve en rouge sur les histogramme la valeur de \[e^{-c}\]. On remarque que le nombre de sommets isolés est centrée autour de cette valeur.
Pour N = 25
N=25
valeurs=seq(-2,4,0.5)
res=c()
obj=c()
for(i in 1:length(valeurs))
{
c = valeurs[i]
res[i] = mean(simulation(100, ((c+log(N))/N)))
obj[i]=exp(-c)
}
plot(obj,x = valeurs, type = "l", col = "red",xlab = "c",ylab = "exp(-c)", main = "Théorie")
plot(res,x = valeurs, type = "l", col = "red",xlab = "c",ylab = "probabilté d'isolation", main = "Expérimentation")
Et pour N = 100
N=100
valeurs=seq(-3,4,0.5)
res=c()
obj=c()
for(i in 1:length(valeurs))
{
c = valeurs[i]
res[i] = mean(simulation(200, ((c+log(N))/N)))
obj[i]=exp(-c)
}
plot(obj,x = valeurs, type = "l", col = "red",xlab = "c",ylab = "exp(-c)", main = "Théorie")
plot(res,x = valeurs, type = "l", col = "red",xlab = "c",ylab = "probabilté d'isolation", main = "Expérimentation")
On peut voir que les courbes sont tres similaire
Probabilité qu’un sommet soit isolé (n-1 car on ne compte pas les boucles) : \[P(X)=(1−p)^{n-1} =(1− \frac{c+log(n)}{n})^{n-1}\]
Calcul de l’espérance (n*p) : \[E(X)=n(1− \frac{c+log(n)}{n})^{n-1}\]
\[=(1+ \frac{−c−log(n)}{n})^{n}\] \[=e^{−c−log(n)}\] \[=e^{−c}e^{−log(\frac{1}{n})}\] \[e^{−c}∗\frac{1}{n}\] \[= \frac{e^{−c}}{n}\]
\[avec (1+\frac{a}{n]})^{n}=e^{a}\]
Sur cette base de calcul j’aimerais essayer de trouver e^c mais je trouve (e^c)/n. Je n’arrive pas à aller plus loin dans la résolution pour corriger ce petit probleme.
On va comparer l’histogramme d’une loi de poisson de parametre e^-c avec celui de notre graphe aléatoire. On prendra N sommets sur des grandes générations de 2000 essais.
c = -2
N= 100
intervalle = seq(0, 20, 2);
hist1 <- hist(simulation(2000, ((c+log(N))/N)), breaks = intervalle, plot = FALSE);
hist2 <- hist(rpois(2000, exp(-c)), breaks = intervalle, plot = FALSE);
m = rbind(hist1$counts, hist2$counts); #Aide sur internet
barplot(m, beside = TRUE, las = 2, legend = c("Graphe aléatoire", "Poisson")) #Aide sur internet
On remarque ici que les 2 histogrammes ont la meme tendance.
c = 0.5
N = 100
exp(-exp(-c));
## [1] 0.5452392
simulation_connexe(1000,((c+log(N))/N))
## [1] 0.575
c = 2
N = 100
exp(-exp(-c));
## [1] 0.873423
simulation_connexe(1000,((c+log(N))/N))
## [1] 0.902
On voit que les résultats sont tres proche, l’égalité est donc verifiée. Les résultats peuvent etre encore plus précis avec des variable (arguments) tres grande.