Épidémiologie
Nous sommes en pleine pandémie (19/03/2020) de coronavirus 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) 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 que 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. COVID-19 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 nouvelle zone.
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
Concernant COVID-19 plusieurs équipes de chercheurs ont cherché à le déterminer :
D'une façon très simple on constate sans peine, que les paramètres sur lequel on peut jouer sont
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ée, 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-etatdevenir
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
; Le variables globales
; max-infectes : on compte le nombre de malade
;
globals [
initialisation?
max-infectes
cumul-contacts
]
;======================================
; 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
to initialisation
ca
if (alea-fixe) [random-seed 19]
set max-infectes 0
initialisation-tortues
souche-infection
maj-etat
set initialisation? true
reset-ticks
end
to reset
ask turtles [die]
set max-infectes 0
set cumul-contacts 0
initialisation-tortues
souche-infection
maj-etat
reset-ticks
end
;=============================
; La simulation, le modèle SIR
;=============================
;
; Déplacement des tortues. On pourrait avoir un déplacement plus sophistiqué.
;
to bouge
ask turtles [
right random 360
forward pas
]
end
;
; 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 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
;=============================
; Informations sur l'évolution
;=============================
to maj-etat
ask turtles [
set color futur-etat
if (color = red) [set duree-maladie duree-maladie + 1]
]
end
to maj-nb-contacts
let cumul 0
ask turtles with [color = red]
[
set cumul cumul + count turtles with [color = white] in-radius distance-non-sociale
]
set cumul-contacts cumul
end
to-report prop-max-infecte
report max-infectes * 100 / population-initiale
end
to-report en-bonne-sante
report (count turtles with [color = white or color = green]) * 100 / population-initiale
end
to-report nb-contacts-moyen-par-tick
let n count turtles with [color = red]
if-else (n = 0)
[ report 0 ]
[ report cumul-contacts / n]
end
to-report R0
report nb-contacts-moyen-par-tick * proba-de-transmission * duree-contagion
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
let nb-infectes (count turtles with [color = red])
if (nb-infectes > max-infectes) [set max-infectes nb-infectes]
maj-nb-contacts
bouge
tick
end