Épidémiologie
Nous sommes en pleine pandémie (19/03/2020) de coronavirus SARS-CoV-2 (COVID-19) et si les modèles d'épidémiologie sont un peu éloignés de la vie artificielle, ils présentent beaucoup d'intérêt, car il existe à la fois des modèles macroscopiques et des modèles microscopiques. C'est cette approche qui va nous intéresser et l'on va essayer de représenter des comportements individuels et regarder les conséquences sur l'évolution de l'épidémie. Ceci n'a bien sur qu'une vertu pédagogique et n'est en aucun cas un outil prédictif scientifique. L'actualité avec ses recommandations de distanciation sociale (éviter les contacts, on devrait d'ailleurs dire plutôt physique) et de confinement nous offre également des voies pour enrichir nos modèles et les questionner et voir en particulier si c'est des mesures efficaces, pour lutter contre la propagation du virus au sein de notre modèle.
Partons tout d'abord de l'évolution de COVID-19.

On constate clairement que concernant le nombre d'infectés et de victimes le comportement est exponentiel. Si beaucoup de choses sont exponentielles, comme la croissance économique le mot fétiche de la classe politique et des économistes il y a aussi des phénomènes linéaires.
Nos voisins Rouennais viennent de vivre récemment une catastrophe industrielle avec l'accident de lubrizol, imaginons qu'un nuage toxique létal se soit répandu sur l'agglomération de Rouen. Cet accident a eu lieu la nuit et donc 90% de la population était chez elle. Si l'on suppose que les habitations sont suffisamment étanches le nombre de victime sera au plus de 10%. De plus une fois le nuage dispersé l'effet létal sera éloigné, en supposant qu'il n'y ait pas de résidu dans l'environnement, et cela signifiera l'arrêt du phénomène. Le virus SARS-CoV-2 est repéré en novembre 2019 à Wuhan, c'est donc le début de l'épidémie et il y a encore le 19 mars 2020 des personnes contaminées et également il y a de nombreux foyers qui continuent à se développer ainsi que l'apparition de nouvelles zones.
Modèle SIR
Une épidémie fonctionne par contagion et par exemple suivant le taux de transmission du virus un premier malade transmet le virus à deux malades qui transmettent le virus ... les informaticiens qui vous êtes auront repéré un arbre binaire et bien une croissance exponentielle. Si maintenant un malade contamine moins d'un individu sain, alors la maladie va s'éteindre. Il existe des modèles sophistiqués mais nous allons nous contenter d'un modèle simple, le modèle SIR. Il y a 3 catégories d'individus : les Sains, les Infectés et les Remis i.e ceux qui sont guéris. On peut intégrer de la mortalité, mais d'une certaine façon les morts n'infectent pas les autres et peuvent dans un premier temps être "intégrés" aux remis. Il y a deux phénomènes :
- les infectés vont contaminer des personnes saines.
- Les infectés vont progressivement guérir (ou éventuellement mourir).
Chaque individu appartient donc à un compartiment :S
,I
ouR
.

Pour une maladie donnée, on va fixer la durée D
(en jour par exemple) durant un laquelle un malade est contagieux, la probabilité P
qu'un contact entre un individu infecté et un individu sain provoque la transmission du virus à ce dernier. Le nombre total d'individus contaminés par un malade est donc
R_0 = C \times P \times D \text{ avec } C \text{ le nombre de contacts par unité de temps}
Concernant COVID-19 plusieurs équipes de chercheurs ont cherché à le déterminer : 1,5 \leq R_0 \leq 6,68
Source, les derniers travaux indiquent plutôt entre 2 et 3. Bon on voit, c'est supérieur à 1, mais on s'en serait douté vu la progression de la pandémie ! Cela diffère en particulier en fonction des modèles et des données.
D'une façon très simple on constate sans peine, que les paramètres sur lesquels on peut jouer sont D
en ayant un traitement efficace, P
avec des règles d'hygiène individuelle, C
grâce à la distanciation sociale (bulle de sécurité, confinement). Vous aurez également remarqué que si on diminue le nombre de S
(par vaccination), on diminuera le nombre de I
et la mortalité. ceci est un petit message pour les antis-vax.
Simulation
Nous pourrions dans un premier temps utiliser un automate cellulaire et considérer l'évolution sur une grille.

Je vous laisse cela en exercice.
Nous allons provoquer une épidémie parmi nos tortues et essayer de voir comment cela évolue. Une tortue va donc être, saine, infectée, ou remise. Elles vont se déplacer aléatoirement et avoir d'éventuels contacts. Commençons donc par coder cela simplement.
;======================================
; Initialisation de nos pauvres tortues
;======================================
;
; Initialisation des tortues
; - la couleur code l'état blanche = S, rouge = I, vert = R
; - position aléatoire
; - non infectée (blanche)
to initialisation-tortues
create-turtles population-initiale [
set color white
set size 0.5
setxy random-pxcor random-pycor
]
end
;
; On tire au hasard nb-premiere-infectee tortues.
; Leur état change donc.
;
to souche-infection
ask n-of nb-premiere-infectee turtles [
set color red
]
end
to initialisation
ca
initialisation-tortues
souche-infection
reset-ticks
end
;==============
; La simulation
;==============
;
; Déplacement des tortues. On pourrait avoir un déplacement plus sophistiqué.
;
to bouge
ask turtles [
right random 360
forward pas
]
end
;
; Lancement de la simulation
;
to execute
bouge
tick
end
Il nous faut maintenant modéliser la propagation de l'épidémie. La couleur de nos tortues va servir à coder l'état :
S blanche, I rouge et enfin R vert. Pour chaque tortue on calculera la durée de son infection, cette durée sera la
même pour toutes. Notre simulation se fera avec un pas de temps discret et la génération i+1
sera déterminée en
fonction de la génération i
. L'état des tortues sera donc modifié qu'en fin de calcul de chaque génération. Pour cela chaque tortue va avoir un attribut futur-etat
. On fixe également au départ les tortues qui sont infectées.
turtles-own[
futur-etat
duree-maladie
]
;======================================
; Initialisation de nos pauvres tortues
;======================================
turtles-own[
futur-etat
duree-maladie
]
;
; Initialisation des tortues
; - la couleur code l'état blanche = S, rouge = I, vert = R
; - position aléatoire
; - non infectée (blanche)
to initialisation-tortues
create-turtles population-initiale [
set futur-etat white
set size 0.5
set duree-maladie 0
setxy random-pxcor random-pycor
]
end
;
; On tire au hasard nb-premiere-infectee tortues.
; Leur état change donc.
;
to souche-infection
ask n-of nb-premiere-infectee turtles [
set futur-etat red
]
end
L'épidémie a donc maintenant démarré, nous allons maintenant modéliser sa propagation avec un modèle SIR. Dans un premier temps modélisons S -> I
, autrement dit la contamination. Chaque tortue S
(blanche) va compter dans son voisinage le nombre de tortues I
. Une tortue S
sera alors contaminée en fonction de la probabilité de transmission et bien sur également aussi en fonction du nombre de tortues I
. Pour cela on réalise un tirage aléatoire. Une tortue nouvellement contaminée voit son futur-etat
devenir red
.
;
; Contamination S -> I
; On compte le nombre de voisines infectées en fonction de la distance
; La contamination se fait en fonction d'une probabilité
;
to infection-des-saines
ask turtles with [color = white] [
let nombre-de-voisines-infectees (count other turtles with [color = red] in-radius distance-non-sociale)
if (random-float 1 < 1 - (((1 - proba-de-transmission) ^ nombre-de-voisines-infectees)))
[set futur-etat red]
]
end
Les tortues restent infectées durant une durée fixe duree-contagion
. On pourrait bien évidemment mettre de la variation, qui représenterait la variété individuelle et également pourquoi pas l’efficacité d'un traitement. Cette durée maximale de l'état infectieux permet de passer de l'état I -> R
.
;
; Les infectées sortent de la maladie, elles deviennent remise I -> R
;
to fin-maladie
ask turtles with [color = red]
[
if (duree-maladie > duree-contagion) [ set futur-etat green]
]
end
Nous avons donc notre modèle, il nous reste à mettre à jour à chaque pas de simulation l'état de nos tortues et être en mesure de lancer la simulation.
to maj-etat
ask turtles [
set color futur-etat
if (color = red) [set duree-maladie duree-maladie + 1]
]
end
;===========================
; Lancement de la simulation
;===========================
to execute
let n count turtles with [color = red]
if (n = 0) or (n = population-initiale) [stop]
infection-des-saines
fin-maladie
maj-etat
bouge
tick
end
Il ne reste plus qu'à explorer le modèle maintenant et à analyser les résultats. Vous pouvez tester, en jouant sur la probabilité de transmission ou encore sur la distanciation sociale.

On retrouve la courbe de notre ministre de la santé Olivier Veran. Il nous explique autre chose le mécanisme d’écrêtage qui doit permettre de ne pas engorger les services hospitaliers.
Comme on peut le constater dans notre cas, la distanciation sociale a bien effectivement des conséquences sur l'évolution de l'épidémie. Cela aplatit bien la courbe, par contre le nombre de contaminé a la fin n'a pas varié significativement. Je vous conseille aussi de rajouter le suivi de R_0
dont tout le monde parle. Ce qui est intéressant maintenant et je vous le laisse en exercice, je reviendrai vers vous plus tard c'est de construire des scénarios (il faut compléter le modèle). Quelques exemples :
- mesures de confinements ;
- isolements des porteurs détectés ;
- traitement réduisant la durée d'infectiosité ;
- .....
- passage à l'échelle.
Vous pouvez aussi tester les différents scénarios de sortie de confinement, pour cela vous pouvez vous aider avec ce rapport.
Modèle macro
Avec un bon vieux tableur et en prenant les chiffres issus de https://fr.wikipedia.org/wiki/Pand%C3%A9mie_de_Covid-19_en_France