library(plyr)
## Warning: package 'plyr' was built under R version 3.3.2
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.3.2
set.seed(1)
# N : Taille de la population
# init : Nombre de contaminés à l'initialisation
TpsContamination_GC <- function(N,init) {
pop <- rep(0,N)
# Choix aléatoire des individus contaminés au départ de la simulation
C <- sample(1:N,init)
for(i in 1:init)
pop[C[i]] <- 1
# Initialisation de Tn
Tn <- 0
# Tant qu'il reste des induvidus non contaminés
while(!setequal(pop,1)){
# Tirage au sort de 2 individus
I1 <- sample(1:N,1)
I2 <- sample(1:N,1)
while(I1==I2)
I2 <- sample(1:N,1)
# Si leur valeur dans pop est différente,
# l'un est contaminé et contamine le deuxième
if(pop[I1]!=pop[I2]){
pop[I1] <- 1
pop[I2] <- 1
}
# On incrémente le temps de contamination
Tn <- Tn + 1
}
Tn
}
TpsContamination_GC(100,1)
## [1] 464
TpsContamination_GC(100,1)
## [1] 716
TpsContamination_GC(100,1)
## [1] 592
On constate alors que d’une simulation à une autre, le temps de contamination peut varier considérablement. Réalisons maintenant cette simulation plusieurs fois sur une taille de population fixe afin de trouver le temps moyen de contamination. Cela ajoutera de la précision.
# N : Taille de la population
# init : Nombre de contaminés à l'initialisation
# A : Nombre d'appel à la simulation précédente
TpsMoyen_GC <- function(N,init,A){
# Sauvegarde de tous les Tn
TNs <- c()
for(i in 1:A)
TNs[i] <- TpsContamination_GC(N,init)
# On retourne la moyenne des valeurs obtenues
mean(TNs)
}
TpsMoyen_GC(100,1,1000)
## [1] 513.294
A présent, faisons varier N. On observera les résultats obtenus sur un graphique afin d’en tirer des conclusions.
# N : Taille maximale de la population
# init : Nombre de contaminés à l'initialisation
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
# Points : Nombre de points sur le graphique
Representation_GC <- function(N,init,A,Points){
D <- data.frame()
# On répartit les points équitablement sur la taille de la population N
for(i in seq(1,N,Points)){
Tm <- TpsMoyen_GC(i,init,A)
D <- rbind(D,data.frame(i,Tm))
}
# Affichage graphique
plot(x=D$i,y=D$Tm,xlab="Population",ylab="Temps de contamination")
# Avec une tendance
abline(lm(D$Tm~D$i),col="forestgreen")
}
Representation_GC(100,1,1000,10)
Ajoutons sur le graphique tous les echantillons calculés pour chaque taille donnée
# N : Taille maximale de la population
# init : Nombre de contaminés à l'initialisation
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
# Points : Nombre de points sur le graphique
Representation2_GC <- function(N,init,A,Points){
D <- data.frame(N=c(),Tn=c())
# On répartit les points équitablement sur la taille de la population N
for(i in seq(1,N,Points))
for(j in 1:A)
D <- rbind(D,data.frame(N=c(i),Tn=TpsContamination_GC(i,init)))
# D2 permet de faire une "courbe" de tendance
D2 <- ddply(D,c("N"),summarize,mean=mean(Tn),var=var(Tn),se=2*sqrt(var(Tn))/sqrt(length(Tn)))
# Affichage graphique
ggplot(data=D,aes(x=N,y=Tn)) + geom_point(alpha=.3) + geom_line(data=D2,aes(y=mean),color="forestgreen")
}
Representation2_GC(100,1,1000,10)
# Calcul d'esperance :
# S'il y a i personnes contaminées, la probabilité de selctionner un contaminé est i/N. Il faut ensuite choisir un individu non contaminé : (N-i)/(N-1) soit f(i,N) = 2*i*(N-i)/N*(N-1). On obtient le nombre de tentative de cette étape en calculant l'inverse de f : 1/f. Ainsi, l'espérance de Tn vaut : 1 / ( Somme i allant de (1 à N) (2*i*(N-i)/(N*(N-1))))
TpsMoyen_GC(100,1,1000)
## [1] 509.129
TpsMoyen_GC(100,10,1000)
## [1] 366.26
TpsMoyen_GC(100,50,1000)
## [1] 259.335
Comme on pouvait l’imaginer, le temps de contamination diminue comme le nombre de contaminés à l’initialisation augmente. Avec une courbe, regardons plus en détails l’évolution de ce temps de contamination. Je pense que plus le nombre de contaminés diverge du nombre de non contaminés, plus il faudra de temps pour contaminer un individu supplémentaire. En tirant aléatoirement 2 individus si un seul parmi une grande population est infecté (ou non infecté) il sera très difficile de le sélectionner pour contaminer un autre individu.
# N : Taille maximale de la population
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
# Points : Nombre de points sur le graphique
Representation3_GC <- function(N,A,Points){
D <- data.frame()
# On répartit les points équitablement sur la taille de la population N
for(i in seq(1,N,Points)){
Tm <- TpsMoyen_GC(N,i,A)
D <- rbind(D,data.frame(i,Tm))
}
# Affichage graphique
plot(x=D$i,y=D$Tm,xlab="Population initialement contaminée",ylab="Temps de contamination")
}
Representation3_GC(100,500,10)
Le temps de contamination n’évolue pas linéairement, la courbe obtenue s’apparente plutôt à une fonction du style de -tan(x), où le temps évolue rapidement sur les extrémités, mais lentement sur le centre. Cela confirme notre hypothèse initiale. Ajoutons toutes les moyennes calculées au graphique comme on a fait précédemment.
# N : Taille maximale de la population
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
# Points : Nombre de points sur le graphique
Representation4_GC <- function(N,A,Points){
D <- data.frame(Contamines=c(),Tn=c())
# On répartit les points équitablement sur la taille de la population N
for(i in seq(1,N,Points))
for(j in 1:A)
D <- rbind(D,data.frame(Contamines=c(i),Tn=TpsContamination_GC(N,i)))
# D2 permet de faire une "courbe" de tendance
D2 <- ddply(D,c("Contamines"),summarize,mean=mean(Tn),var=var(Tn),se=2*sqrt(var(Tn))/sqrt(length(Tn)))
# Affichage graphique
ggplot(data=D,aes(x=Contamines,y=Tn)) + geom_point(alpha=.3) + geom_line(data=D2,aes(y=mean),color="forestgreen")
}
Representation4_GC(100,1000,10)
Le graphique obtenu nous permet donc de conclure et de valider définitivement nos hypothèses.
Simulation du temps de contamination sur un graphe ligne 1D. On a la conviction initiale que la position du premier contaminé influencera Tn. On ajoute donc un paramètre pour choisir le premier contaminé qui sera utilisé plus tard.
# N : Taille de la population
# init : Nombre de contaminés à l'initialisation
# M : Position du premier contaminé
TpsContamination_D <- function(N,init,M) {
pop <- rep(0,N)
# Choix aléatoire des individus contaminés au départ de la simulation en prévoyant que la position de init puisse être choisie par l'utilisateur
if(init==1 && M>0 && M<=N)
pop[M] <- 1
else{
C <- sample(1:N,init)
for(i in 1:init)
pop[C[i]] <- 1
}
# Initialisation de Tn
Tn <- 0
# Tant qu'il reste des induvidus non contaminés
while(!setequal(pop,1)){
# Tirage au sort de 1 individu
I1 <- sample(1:N,1)
# S'il est sur un bord :
if(I1==1)
I2 <- 2
else if(I1==N)
I2 <- N-1
# Sinon, on tire un des deux voisins
else
I2 <- sample(c(I1-1,I1+1),1)
# Si leur valeur dans pop est différente,
# l'un est contaminé et contamine le deuxième
if(pop[I1]!=pop[I2]){
pop[I1] <- 1
pop[I2] <- 1
}
# On incrémente le temps de contamination
Tn <- Tn + 1
}
Tn
}
TpsContamination_D(100,1,0)
## [1] 5386
TpsContamination_D(100,1,0)
## [1] 8375
TpsContamination_D(100,1,0)
## [1] 8343
Réalisons maintenant cette simulation plusieurs fois sur une taille de population fixe afin de trouver le temps moyen de contamination. Cela ajoutera de la précision, car on constate que d’une simulation à une autre, Tn peut varier considérablement.
# N : Taille de la population
# init : Nombre de contaminés à l'initialisation
# A : Nombre d'appel à la simulation précédente
TpsMoyen_D <- function(N,init,A,M){
# Sauvegarde de tous les Tn
TNs <- c()
for(i in 1:A)
TNs[i] <- TpsContamination_D(N,init,M)
# On retourne la moyenne des valeurs obtenues
mean(TNs)
}
TpsMoyen_D(100,1,500,0)
## [1] 7383.368
A présent, faisons varier N. On observera les résultats obtenus sur un graphique afin d’en tirer des conclusions.
# N : Taille maximale de la population
# init : Nombre de contaminés à l'initialisation
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
# Points : Nombre de points sur le graphique
Representation_D <- function(N,init,A,Points,M){
D <- data.frame()
# On répartit les points équitablement sur la taille de la population N
for(i in seq(1,N,Points)){
Tm <- TpsMoyen_D(i,init,A,M)
D <- rbind(D,data.frame(i,Tm))
}
# Affichage graphique
plot(x=D$i,y=D$Tm,xlab="Population",ylab="Temps de contamination")
# Avec une tendance
abline(lm(D$Tm~D$i),col="forestgreen")
}
Representation_D(100,1,10,10,0)
La courbe obtenue semble de type exponentielle. Ajoutons sur le graphique tous les echantillons calculés pour chaque taille donnée afin de s’en assurer.
# N : Taille maximale de la population
# init : Nombre de contaminés à l'initialisation
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
# Points : Nombre de points sur le graphique
Representation2_D <- function(N,init,A,Points,M){
D <- data.frame(N=c(),Tn=c())
# On répartit les points équitablement sur la taille de la population N
for(i in seq(1,N,Points))
for(j in 1:A)
D <- rbind(D,data.frame(N=c(i),Tn=TpsContamination_D(i,init,M)))
# D2 permet de faire une "courbe" de tendance
D2 <- ddply(D,c("N"),summarize,mean=mean(Tn),var=var(Tn),se=2*sqrt(var(Tn))/sqrt(length(Tn)))
# Affichage graphique
ggplot(data=D,aes(x=N,y=Tn)) + geom_point(alpha=.3) + geom_line(data=D2,aes(y=mean),color="forestgreen")
}
Representation2_D(100,1,100,10,0)
TpsMoyen_D(100,1,300,0)
## [1] 7442.077
TpsMoyen_D(100,10,300,0)
## [1] 1718.777
TpsMoyen_D(100,50,300,0)
## [1] 399.2167
Comme on pouvait l’imaginer, le temps de contamination diminue comme le nombre de contaminés à l’initialisation augmente. Avec une courbe, regardons plus en détails l’évolution de Tn en fonction du nombre initial de contaminés.
# N : Taille maximale de la population
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
# Points : Nombre de points sur le graphique
Representation3_D <- function(N,A,Points,M){
D <- data.frame()
# On répartit les points équitablement sur la taille de la population N
for(i in seq(1,N,Points)){
Tm <- TpsMoyen_D(N,i,A,M)
D <- rbind(D,data.frame(i,Tm))
}
# Affichage graphique
plot(x=D$i,y=D$Tm,xlab="Population initialement contaminée",ylab="Temps de contamination")
}
Representation3_D(100,200,10,0)
Comme pour la question 1, plus le nombre de contaminés est grand plus Tn est petit, on ne visualise cependant plus l’allure -tan(x) car le temps de contamination devient trop faible pour le voir.
# N : Taille maximale de la population
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
# Points : Nombre de points sur le graphique
Representation4_D <- function(N,A,Points,M){
D <- data.frame(Contamines=c(),Tn=c())
# On répartit les points équitablement sur la taille de la population N
for(i in seq(1,N,Points))
for(j in 1:A)
D <- rbind(D,data.frame(Contamines=c(i),Tn=TpsContamination_D(N,i,M)))
# D2 permet de faire une "courbe" de tendance
D2 <- ddply(D,c("Contamines"),summarize,mean=mean(Tn),var=var(Tn),se=2*sqrt(var(Tn))/sqrt(length(Tn)))
# Affichage graphique
ggplot(data=D,aes(x=Contamines,y=Tn)) + geom_point(alpha=.3) + geom_line(data=D2,aes(y=mean),color="forestgreen")
}
Representation4_D(100,100,10,0)
A présent, regardons l’impact de la position du premier contaminé sur Tn.
Position_D <- function(N,A){
D <- data.frame(N=c(),Tn=c())
# On répartit les points équitablement sur la taille de la population N
for(i in 1:N)
for(j in 1:A)
D <- rbind(D,data.frame(N=c(i),Tn=TpsContamination_D(N,1,i)))
# D2 permet de faire une "courbe" de tendance
D2 <- ddply(D,c("N"),summarize,mean=mean(Tn),var=var(Tn),se=2*sqrt(var(Tn))/sqrt(length(Tn)))
# Affichage graphique
ggplot(data=D,aes(x=N,y=Tn)) + geom_point(alpha=.3) + geom_line(data=D2,aes(y=mean),color="forestgreen")
}
Position_D(100,5)
On confirme clairement notre conviction initiale, ce qui est logique. En position 1, la contamination ne peut s’étendre que vers la droite, divisant les possibilités de contamination par 2, et plus on commence approche d’un bord, plus on éliminera rapidement l’expansion vers un côté.
Encore une fois, on a la conviction que la position du premier individu contaminé influencera le temps de contamination. On considérera un choix du premier contaminé sur la diagonale de la matrice pour étudier Tn. On suppose également que le temps de ocntamination aura une évolution similaire aux questions 1 et 2.1. sqrt(N) devra être un entier, on ne traite pas les autres cas.
# N : Taille de la population
# init : Nombre de contaminés à l'initialisation
TpsContamination_DD <- function(N,init,M) {
pop <- rep(0,N)
# Choix aléatoire des individus contaminés au départ de la simulation
Cote <- sqrt(N)
if(init==1 && M>0 && M<=N)
pop[M] <- 1
else{
C <- sample(1:N,init)
for(i in 1:init)
pop[C[i]] <- 1
}
# Initialisation de Tn
Tn <- 0
# Tant qu'il reste des induvidus non contaminés
while(!setequal(pop,1)){
# Tirage au sort de 1 individu
I1 <- sample(1:N,1)
# On différencie les differents cas de I1 (bords, coins, ...)
if(I1%%Cote==0){
if(I1==Cote)
I2 <- sample(c(I1+Cote,I1-1),1)
else if(I1==N)
I2 <- sample(c(I1-Cote,I1-1),1)
else
I2 <- sample(c(I1-Cote,I1+Cote,I1-1),1)
}
else if(I1%%Cote==1){
if(I1==1)
I2 <- sample(c(I1+Cote,2),1)
else if(I1==N-(Cote-1))
I2 <- sample(c(I1-Cote,I1+1),1)
else
I2 <- sample(c(I1-Cote,I1+Cote,I1+1),1)
}
else if(I1<=Cote)
I2 <- sample(c(I1+Cote,I1-1,I1+1),1)
else if(I1>(N-Cote))
I2 <- sample(c(I1-Cote,I1-1,I1+1),1)
else
I2 <- sample(c(I1-Cote,I1-1,I1+1,I1+Cote),1)
# Si leur valeur dans pop est différente,
# l'un est contaminé et contamine le deuxième
if(pop[I1]!=pop[I2]){
pop[I1] <- 1
pop[I2] <- 1
}
# On incrémente le temps de contamination
Tn <- Tn + 1
}
Tn
}
TpsContamination_DD(100,1,0)
## [1] 919
TpsContamination_DD(100,1,0)
## [1] 1081
TpsContamination_DD(100,1,0)
## [1] 964
Réalisons maintenant cette simulation plusieurs fois sur une taille de population fixe afin de trouver le temps moyen de contamination. Cela ajoutera de la précision.
# N : Taille de la population
# init : Nombre de contaminés à l'initialisation
# A : Nombre d'appel à la simulation précédente
TpsMoyen_DD <- function(N,init,A,M){
# Sauvegarde de tous les Tn
TNs <- c()
for(i in 1:A)
TNs[i] <- TpsContamination_DD(N,init,M)
# On retourne la moyenne des valeurs obtenues
mean(TNs)
}
TpsMoyen_DD(100,1,500,0)
## [1] 1164.514
A présent, faisons varier N. On observera les résultats obtenus sur un graphique afin d’en tirer des conclusions.
# N : Taille maximale de la population
# init : Nombre de contaminés à l'initialisation
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
Representation_DD <- function(N,init,A,M){
D <- data.frame()
NN <- sqrt(N)
for(i in 1:NN){
Tm <- TpsMoyen_DD(i*i,init,A,M)
D <- rbind(D,data.frame(i,Tm))
}
# Affichage graphique
plot(x=D$i*i,y=D$Tm,xlab="Population",ylab="Temps de contamination")
}
Representation_DD(100,1,100,0)
La courbe obtenue semble de type exponentielle. Ajoutons sur le graphique tous les echantillons calculés pour chaque taille donnée.
# N : Taille maximale de la population
# init : Nombre de contaminés à l'initialisation
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
Representation2_DD <- function(N,init,A,M){
D <- data.frame(N=c(),Tn=c())
# On répartit les points équitablement sur la taille de la population N
NN <- sqrt(N)
for(i in 1:NN)
for(j in 1:A)
D <- rbind(D,data.frame(N=c(i*i),Tn=TpsContamination_DD(i*i,init,M)))
# D2 permet de faire une "courbe" de tendance
D2 <- ddply(D,c("N"),summarize,mean=mean(Tn),var=var(Tn),se=2*sqrt(var(Tn))/sqrt(length(Tn)))
# Affichage graphique
ggplot(data=D,aes(x=N,y=Tn)) + geom_point(alpha=.3) + geom_line(data=D2,aes(y=mean),color="forestgreen")
}
Representation2_DD(100,1,100,0)
TpsMoyen_DD(100,1,100,0)
## [1] 1127.03
TpsMoyen_DD(100,10,100,0)
## [1] 588.04
TpsMoyen_DD(100,50,100,0)
## [1] 300.83
Comme on pouvait l’imaginer, le temps de contamination diminue comme le nombre de contaminés à l’initialisation augmente. Avec une courbe, regardons plus en détails l’évolution de ce temps de contamination en fonction du nombre initial de contaminés.
# N : Taille maximale de la population
# A : Nombre d'appel à la simulation permettant d'obtenir un temps de contamination moyen
Representation3_DD <- function(N,A,M){
D <- data.frame()
NN <- sqrt(N)
for(i in seq(1,N,2)){
Tm <- TpsMoyen_DD(N,i,A,M)
D <- rbind(D,data.frame(i,Tm))
}
# Affichage graphique
plot(x=D$i,y=D$Tm,xlab="Population initialement contaminée",ylab="Temps de contamination")
}
Representation3_DD(100,10,0)
Le temps de contamination n’évolue pas linéairement, la courbe obtenue s’apparente plutôt à une fonction du style de -tan(x), où le temps évolue rapidement sur les extrémités, mais lentement sur le centre. Cela confirme notre hypothèse initiale. Confirmons cette étude en ajoutant toutes les moyennes calculées au graphique comme on a fait précédemment.
Representation4_DD <- function(N,A,M){
D <- data.frame(Contamines=c(),Tn=c())
# On répartit les points équitablement sur la taille de la population N
for(i in seq(1,N,10))
for(j in 1:A)
D <- rbind(D,data.frame(Contamines=c(i),Tn=TpsContamination_DD(N,i,M)))
# D2 permet de faire une "courbe" de tendance
D2 <- ddply(D,c("Contamines"),summarize,mean=mean(Tn),var=var(Tn),se=2*sqrt(var(Tn))/sqrt(length(Tn)))
# Affichage graphique
ggplot(data=D,aes(x=Contamines,y=Tn)) + geom_point(alpha=.3) + geom_line(data=D2,aes(y=mean),color="forestgreen")
}
Representation4_DD(100,100,0)
A présent, regardons l’impact de la position du premier contaminé sur Tn (sur la diagonale). L’évolution de Tn sera similaire à la question 2.1 sauf qu’au lieu de s’étendre sur deux côtés, on s’étend sur 4 côtés, donc si on commence d’un coin, on mettra plus de temps que si on commence du centre.
Position_DD <- function(N,A){
D <- data.frame(N=c(),Tn=c())
# On répartit les points équitablement sur la taille de la population N
NN <- sqrt(N)
for(i in 1:NN)
for(j in 1:A)
D <- rbind(D,data.frame(N=c((i-1)*NN+i),Tn=TpsContamination_DD(N,1,(i-1)*NN+i)))
# D2 permet de faire une "courbe" de tendance
D2 <- ddply(D,c("N"),summarize,mean=mean(Tn),var=var(Tn),se=2*sqrt(var(Tn))/sqrt(length(Tn)))
# Affichage graphique
ggplot(data=D,aes(x=N,y=Tn)) + geom_point(alpha=.3) + geom_line(data=D2,aes(y=mean),color="forestgreen")
}
Position_DD(100,50)
On confirme clairement notre conviction initiale, ce qui est logique. En position 1, la contamination ne peut s’étendre que vers le bas et la droite, divisant les possibilités de contamination par 2, et plus on s’approche d’un coin, plus on éliminera rapidement l’expansion vers un ou deux côtés.