Question 1.1 On a adopté l'algorithme Prüfer pour constuire un arbre en etant donné la séquence de Prüfer aléatoirement par la fonction sample(n,m,replace=TRUE) qui engendre une séquence de longueur m entre 1 a n aléatoirement. Prouver:
library(igraph)
routage <- function(n = 100) {
# sequence de l'ordre engendre par l'algorithme de Pufer
pa <- n - 2
pp <- n
seq <- c(pa)
seq <- sample(pp, size = pa, replace = TRUE)
degree <- c(pp)
g <- graph.empty(pp, directed = FALSE)
# initialiser la tableau de degree
for (i in 1:pp) {
degree[i] <- 1
}
# faire additionner 1 au degré a chaque node apparaissant dans la sequence
# d'ordre
for (i in 1:pa) {
degree[seq[i]] <- degree[seq[i]] + 1
}
# restituer l'arbre par l'algorithme Prufer
for (i in 1:pa) {
for (j in 1:pp) {
if (degree[j] == 1) {
m <- seq[i]
g <- add.edges(g, c(j, m), attr = list(width = 1))
degree[seq[i]] <- degree[seq[i]] - 1
degree[j] <- degree[j] - 1
break
}
}
}
# trouver les deux nodes qui ont le degree de 1
u <- 0
v <- 0
for (i in 1:pp) {
if (degree[i] == 1) {
if (u == 0) {
u <- i
} else {
v <- i
break
}
}
}
g <- add.edges(g, c(u, v), attr = list(width = 1))
degree[u] <- degree[u] - 1
degree[v] <- degree[v] - 1
plot(g)
}
routage(30)
question 1.2 Diametre de l'arbre
library(igraph)
routage <- function(n = 100) {
# sequence de l'ordre engendre par l'algorithme de Pufer
pa <- n - 2
pp <- n
seq <- c(pa)
seq <- sample(pp, size = pa, replace = TRUE)
degree <- c(pp)
g <- graph.empty(pp, directed = FALSE)
# initialiser la tableau de degree
for (i in 1:pp) {
degree[i] <- 1
}
# faire additionner 1 au degré a chaque node apparaissant dans la sequence
# d'ordre
for (i in 1:pa) {
degree[seq[i]] <- degree[seq[i]] + 1
}
# restituer l'arbre par l'algorithme Prufer
for (i in 1:pa) {
for (j in 1:pp) {
if (degree[j] == 1) {
m <- seq[i]
g <- add.edges(g, c(j, m), attr = list(width = 1))
degree[seq[i]] <- degree[seq[i]] - 1
degree[j] <- degree[j] - 1
break
}
}
}
# trouver les deux nodes qui ont le degree de 1
u <- 0
v <- 0
for (i in 1:pp) {
if (degree[i] == 1) {
if (u == 0) {
u <- i
} else {
v <- i
break
}
}
}
g <- add.edges(g, c(u, v), attr = list(width = 1))
degree[u] <- degree[u] - 1
degree[v] <- degree[v] - 1
l <- diameter(g)
print("La dimetre est:")
print(l)
plot(g, xlab = paste("diametre = ", l), main = "L'arbre engendré par l'algo Prüfer")
}
par(mfrow = c(3, 1), mar = c(4, 4, 2, 2))
routage(10)
## [1] "La dimetre est:"
## [1] 8
routage(100)
## [1] "La dimetre est:"
## [1] 32
routage(1000)
## [1] "La dimetre est:"
## [1] 106
Quetion 1.3:Diametre moyen d'un arbre uniformement généré
library(igraph)
routage <- function(n = 100) {
# sequence de l'ordre engendre par l'algorithme de Pufer
pa <- n - 2
pp <- n
seq <- c(pa)
seq <- sample(pp, size = pa, replace = TRUE)
degree <- c(pp)
g <- graph.empty(pp, directed = FALSE)
# initialiser la tableau de degree
for (i in 1:pp) {
degree[i] <- 1
}
# faire additionner 1 au degré a chaque node apparaissant dans la sequence
# d'ordre
for (i in 1:pa) {
degree[seq[i]] <- degree[seq[i]] + 1
}
# restituer l'arbre par l'algorithme Prufer
for (i in 1:pa) {
for (j in 1:pp) {
if (degree[j] == 1) {
m <- seq[i]
g <- add.edges(g, c(j, m), attr = list(width = 1))
degree[seq[i]] <- degree[seq[i]] - 1
degree[j] <- degree[j] - 1
break
}
}
}
# trouver les deux nodes qui ont le degree de 1
u <- 0
v <- 0
for (i in 1:pp) {
if (degree[i] == 1) {
if (u == 0) {
u <- i
} else {
v <- i
break
}
}
}
g <- add.edges(g, c(u, v), attr = list(width = 1))
degree[u] <- degree[u] - 1
degree[v] <- degree[v] - 1
l <- diameter(g)
}
n = 20
ensemble <- c(500)
x <- 0
for (i in 1:500) {
x <- x + routage(n)
ensemble[i] <- routage(n)
}
d <- x/500
ss <- n - d
print("l'intervalle de confiance est:")
## [1] "l'intervalle de confiance est:"
print(paste("[", ss, ",", d, "]"))
## [1] "[ 9.708 , 10.292 ]"
hist(ensemble, breaks = 20, col = "red", xlim = c(0, n), ylim = c(0, 150), xlab = "diamétre",
ylab = "Fréquence", main = "Diamèter séquence", sub = d - n/2)