Sujet 1 : Transmission de virus

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)

Question 1 : Cas du graphe complet

# 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.

Question 2.1 : Graphe ligne 1D

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é.

Question 2.2 : Graphe ligne 2D

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.