Net Logo

14
Universitatea Tehnica "Gheorghe Asachi" Iasi Facultatea de Automatica si Calculatoare 13 Raspandirea virusului gripal intr-o comunitate Proiect NetLogo Brucar Ana-Maria (SDTW 1B) Alionte Ana-Maria (SDTW 1A)

description

Net Logo programming

Transcript of Net Logo

Page 1: Net Logo

Universitatea Tehnica "Gheorghe Asachi" Iasi

Facultatea de Automatica si Calculatoare

13

Raspandirea virusului gripal

intr-o comunitate Proiect NetLogo

Brucar Ana-Maria (SDTW 1B)

Alionte Ana-Maria (SDTW 1A)

Page 2: Net Logo

2 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Cuprins

Descriere generala ....................................................................................................................................... 3

Utilizarea programului .................................................................................................................................. 3

Structura programului................................................................................................................................... 5

Contributii proprii ....................................................................................................................................... 12

Capturi ecran ............................................................................................................................................... 12

Concluzii ...................................................................................................................................................... 14

Page 3: Net Logo

3 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Descriere generala

Necesitatea intelegerii ecosistemelor, a transmiterii unor virusuri in lumea reala a condus

la crearea unor modele matematice usor de inteles si urmarit chiar si de cei nespecializati in

domeniu.

Gripa este una dintre cele mai raspandite boli, care se manifesta in orice sezon,

predominant in sezonul rece, cu o perioada de incubatie relativ scurta, intre 1 si 3 zile. Sursa de

infectie este reprezentata de omul bolnav, cu forme inaparente sau grave. Gripa se transmite pe

cale aeriana, prin contact direct cu omul bolnav, iar receptivitatea este generala, cu atat mai mult

cu cat imunitatea este mai scazuta.

Proiectul in cauza isi propune sa studieze raspandirea acestei boli intr-o comunitate de

oameni, pe un esantion de maxim 200 de indivizi, plecand de la un numar mic de persoane

infectate (0.025% din numarul total al esantionului), cu un numar redus de medici (maxim 20 de

medici).

Numarul minim de indivizi ai populatiei studiate este de 50 de persoane, iar numarul

minim de medici este de 1 persoana.

Exista trei tipuri de persoane: indivizi sanatosi (reprezentati de culoarea verde), medicii

(reprezentati de culoarea albastra) si indivizi bolnavi/infectati (reprezentati de culoarea rosie).

20% din populatie se considera a fi vaccinata impotriva virusului care declanseaza gripa,

dar aceasta masura nu este 100% sigura, deci nu este exclus ca o parte din acestia sa se

imbolnaveasca.

La contactul cu o persoana bolnava, daca a fost vaccinat si imunitatea este scazuta, sau

daca nu a fost vaccinat, individul este infectat cu virusul care declanseaza gripa. La intalnirea cu

un medic, persoana infectata incepe un proces de vindecare, de crestere a imunitatii. Deoarece

virusul poate prezenta mutatii care duc la deces, acest lucru este reprezentat prin persoane care

nu se vindeca si ajung sa nu mai aiba imunitate, si implicit, vor muri.

Utilizarea programului

Programul este reprezentat de un fisier NetLogo, fluP.nlogo.

O data incarcat, va aparea o fereastra , cu 2 slidere, cu ajutorul carora se vor putea seta numarul

de indivizi ai esantionului studiat (denumit sugestiv initial-people) si numarul de medici

(denumit, de asemenea, sugestiv, doctors), pentru acelasi esantion. Pentru simplificare, se

considera ca o persoana bolnava nu poate fi medic, iar un medic nu se poate imbolnavi de gripa.

Page 4: Net Logo

4 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Fig 1. Fereastra initiala NetLogo (indivizii de culoare rosie reprezinta numarul persoanelor

bolnave din esantion, indivizii de culoare albastra reprezinta doctorii, iar indivizii de culoare

verde reprezinta indivizii sanatosi)

De asemenea, programul mai dispune si de doua butoane, unul pentru initializare,

denumit setup, iar altul pentru executare, denumit go. Se considera ca avem epidemie de gripa

atunci cand numarul persoanelor infectate (%infected) depaseste 80%, moment in care

programul nu mai ruleaza.

Numarul total de indivizi ai populatiei este monitorizat pe tot parcursul rularii si updatat

in timp real. Acest lucru este vizibil, urmarind textul din monitorul People.

Dupa setarea datelor ( initial-people si doctors), se apasa butonul setup, si dupa,

go, pentru urmarirea evolutiei transmiterii virusului. Evolutia este reprezentata pentru usurinta, si

poate fi urmarita si sub forma de grafic, in plotul intitulat sugestiv Flu. Culoarea rosie a

graficului reprezinta numarul persoanelor infectate, iar culoarea albastra a graficului reprezinta

persoanele sanatoase.

Page 5: Net Logo

5 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Structura programului

Programul este alcatuit din mai multe functii si din variabile globale.

Variabile globale

Sunt definite urmatoarele variabile globale :

epidemy - procentul de indivizi infectati de la care se considera ca gripa a

ajuns in stadiul de epidemie ;

doctorsNo - numarul de indivizi din populatie care sunt doctori (reprezentati

prin culoarea albastra) ;

displayNo - numarul total de indivizi ai populatiei;

Variabile specifice indivizilor (turtles-own)

Fiecare individ este caracterizat de un set de variabile, ce vor fi prezentate in cele ce

urmeaza :

imunity - imunitatea individului; un numar asignat random fiecarui individ

( turtle) cuprins in intervalul [1, 100];

vaccination? - variabila de tip boolean, cu urmatoarea semnificatie: true,

daca individul in cauza a fost vaccinat; false, altfel;

isSick? - variabila de tip boolean, setata cu valoarea true, daca

individul ( turtle) este bolnav; altfel, false;

hasSymptoms? - variabila de tip boolean, avand valoarea true, daca

individul prezinta simptomele specifice gripei, false, altfel. Se considera ca

virusul gripal are o perioada de incubatie de 3 zile, deci valoarea true va fi

setata doar daca au trecut 3 zile de la contactul cu o persoana bolnava

(nrDaysInfected >= 3) si variabila isSick are valoarea true;

nrDaysInfected - variabila in care se retine numarul de zile de cand o

persoana este infectata cu virusul gripal

HealingRate - rata de vindecare. Daca individul nu este bolnav, rata de

vindecare se considera a fi 0. Daca individul este bolnav, rata de vindecare se

considera a fi negativa. La intalnirea cu un individ doctor, rata de vindecare se

considera a fi pozitiva. Dupa ce este setata, se aduna la variabila imunity,

determinand astfel imunitatea individului.

Page 6: Net Logo

6 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Functii specifice programului

Programul are doua functii principale, functia setup, a carei rol este initializarea datelor,

si functia go, a carei rol este rularea programului pana se intalneste conditia de oprire.

end

Functia setup, apelata la apasarea butonului setup

Corpul functiei setup este reprezentat de mai multe functii, ce vor fi prezentate in

continuare.

Functia setup-global, apelata in corpul functiei setup

Functia setup-global are rolul de a initializa variabilele globale, descrise mai sus (vezi

Variabile globale).

to setup ;;on pressing setup button, this function is called

clear-all ;; "clean" all data

setup-globals ;; function for defining global variables

setup-people ;; function for setup variables for turtles

update-plot ;; update plot

reset-ticks

end

to setup-globals

set epidemy 80 ;; you have a 80% chance of being infected

set diplayNo 0

end

to setup-people

crt initial-people

[ setxy random-xcor random-ycor

set shape "person"

set imunity random 100

set isSick? (who < initial-people * 0.025)

set vaccination? (who < initial-people * 0.2 + 10) ;;20%

Page 7: Net Logo

7 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Corpul functiei setup-people, apelata in functia setup

Functia setup-people are rolul de a initializa populatia. Astfel, se creaza random un

numar prestabilit de indivizi ( numar cuprins intre [50, 200]), a caror forma este "person", cu o

valoare a imunitatii cuprinsa intre [0, 100], setata, de asemenea, random (set imunity random

100).

Dintre acestia, un numar de 0.025% din totalul esantionului se considera a fi indivizi

bolnavi ( isSick = true), cu o perioada de incubatie a virusului gripal (nrDaysInfected)

setata random, intre [1,3] zile, iar 20% dintre indivizi se considera a fi vaccinati. Dintre indivizii

neinfectati (bolnavi), se aleg un numar de doctors doctori, restul indivizilor considerandu-se a fi

indivizi sanatosi.

Tot in aceasta functie, se seteaza si culorile distinctive pentru tipurile de indivizi : rosu

pentru indivizii bolnavi, verde pentru cei sanatosi si albastru pentru doctori.

set hasSymptoms? false

set vizitaDoctor 0

ifelse isSick?

[ set nrDaysInfected random 3]

[ set nrDaysInfected 0 ]

if isSick?

[

set HealingRate -10

set HealingRate 0

]

ifelse (who > 40 and who <= doctors + 40 )

[ set color blue]

[ set color green ]

if isSick?

[set color red]

]

end

Page 8: Net Logo

8 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Functia setup-people mai cuprinde si update-ul pentru grafic, in aceasta etapa el fiind

reinitializat.

Functia pentru updatarea graficului denumit sugestiv "Flu" (in grafic este reprezentat numarul

de oameni bolnavi - "Sick", in raport cu oamenii considerati sanatosi "Healthy")

In continuare, este prezentata functia go, functie apelata la apasarea butonului go, a carei

rol este de a simula raspandirea gripei intr-o comunitate.

Corpul functiei go

Se verifica daca s-a atins pragul de epidemie. Daca da, se opreste executarea

programului. Altfel, se continua. Indivizii (turtles) au o miscare aleatorie sus - jos, spre dreapta.

Corpul functiei, mai cuprinde, de asemenea, alte trei functii, ce vor fi prezentate in cele ce

to update-plot

set-current-plot "Flu"

set-current-plot-pen "Sick"

plot count turtles with [color = red ]

set-current-plot-pen "Healthy"

plot count turtles with [color = green ]

end

to go

if %infected > epidemy and diplayNo = 0

[ output-print "Epidemie la 80%"

set diplayNo 1 ]

ask turtles

[ forward random 5 - 3

right random 30

]

ask turtles [ getInfected ]

ask turtles [ healing ]

ask turtles [ dieTurtle ]

tick

end

Page 9: Net Logo

9 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

urmeaza. Acestea sunt denumite sugestiv getInfected, a carei rol este de a simula

imbolnavirea unui individ sanatos la intrarea in contact direct cu o persoana infectata, fie ca

aceasta prezinta simptomele gripei sau nu; healing, care simuleaza insanatosirea unei persoane

bolnave de gripa si dieTurtle, care simuleaza moartea unui individ care a suferit o mutatie a

virusului gripal.

Corpul functiei getInfected

to getInfected

let temp one-of (turtles-at -1 0) with [isSick?]

if temp != nobody and color = green [

if not vaccination? and not isSick?

[ set isSick? true

set color red

set nrDaysInfected 0

set hasSymptoms? false

set HealingRate -1

set imunity imunity - HealingRate ]

if isSick?

[ set imunity imunity - HealingRate

set nrDaysInfected nrDaysInfected + 1

if nrDaysInfected > 3

[ set hasSymptoms? true] ]

if vaccination? and not isSick?

[if imunity < 21

[ set isSick? true

set color red

set nrDaysInfected 0

set hasSymptoms? false

set HealingRate -5

set imunity imunity - HealingRate ] ] ]

end

Page 10: Net Logo

10 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Am considerat pozitia -1 0 ca fiind vecinul din fata individului X, unde X este individul

actual. Daca vecinul este bolnav, iar individul actual este sanatos, dar nevaccinat, acesta sa

imbolnaveste automat. Daca individul este deja bolnav, atunci perioada de infectare creste si

imunitatea scade. Daca este vaccinat, dar imunitatea sa este scazuta ( s-a considerat ca imunitatea

este scazuta daca valoarea sa este sub 21), atunci acesta se imbolnaveste.

Corpul functiei getInfected

Daca vecinului individului curent este doctor ( culoarea sa este albastra), iar individul

curent este bolnav si manifesta simptome ( nrDaysInfected >= 3), atunci se considera ca acesta

primeste medicamente si incepe o imbunatatire a starii sale de sanatate. Daca valoarea imunitatii

este ridicata ( >70) si individul este bolnav, se considera ca sistemul sau imunitar este suficient

de puternic pentru a lupta impotriva gripei, si virusul este distrus. In concluzie, individul se

insanatoseste. In concluzie, un individ se poate insanatosi doar daca in prealabil a "vizitat" un

medic sau daca are sistemul imunitar suficient de puternic pentru a distruge virusul.

to healing

let doctor one-of (turtles-at -1 0) with [color = green]

if doctor != nobody and hasSymptoms?

[

set HealingRate 5

set imunity imunity + HealingRate

set nrDaysInfected nrDaysInfected + 1

set vizitaDoctor vizitaDoctor + 1

]

if imunity > 70 and isSick? and vizitaDoctor > 0

[

set HealingRate 0

set isSick? false

set nrDaysInfected 0

set hasSymptoms? false

set color green

]

end

Page 11: Net Logo

11 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Corpul functiei dieTurtle

Daca individul curent are imunitatea foarte scazuta ( valoarea sa este mai mica sau egala

cu 10) si este bolnav, se considera ca virusul a suferit o mutatie, prin urmare, individul (turtle)

moare.

In afara de functiile prezentate mai sus, mai exista doua functii pentru monitorizare/

raportarea numarului de persoane infectate (%infected) si a numarului total de persoane

(noPersons).

Corpurile functiilor de raportare ( %infected si noPersons)

to dieTurtle

if imunity <= 10 and isSick? [ die ]

end set nrDaysInfected 0

set hasSymptoms? false

set color green

]

end

to-report %infected

ifelse any? turtles

[ report (count turtles with [isSick? = true] / count turtles) * 100

]

[ report 0 ]

end

to-report noPeople

report count turtles

end

Page 12: Net Logo

12 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Contributii proprii

Proiectul nu a fost modificat, a fost conceput de la 0, bazandu-ne pe experienta din viata

reala, incercand sa implementam totusi un model simplist si relativ usor de urmarit.

Datele problemei ( numarul de persoane infectate, modul de vindecare, numarul de

doctori, numarul zilelor de incubatie a virusului inainte de aparitia simptomelor, mutatiile) au

fost stabilite urmarind evolutia gripei din viata de zi cu zi. Nu s-a luat in calcul anotimpul sau

ideea de spatii inchise, indivizii ( turtles) avand posibilitatea de a se misca independent de aceste

variabile, intr-o raza prestabilita ( in sus-jos). Am ales ca numarul doctorilor sa fie fix de la bun

inceput deoarece se presupune ca un spital are un numar fix de angajati, acesta nu creste sau

scade in acelasi timp cu numarul bolnavilor.

Totusi, ideea proiectului s-a bazat pe exemplul cu SIDA, din libraria NetLogo.

Capturi ecran

Fig 2. Captura ecran pentru un esantion de 200 de indivizi

Page 13: Net Logo

13 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

In fig. 2, urmarind graficul, se observa cum numarul de persoane sanatoase scade

considerabil in raport cu numarul de persoane bolnave, care creste foarte rapid, ca apoi, raportul

sa se stabilizeze. inainte ca imbolnavirea rapida a populatiei sa fie considerata epidemie (

valoarea prestabilita a unei epidemii fiind de 80%). In acest caz, numarul persoanelor decedate

este de 13.

Fig 3. Captura pentru un esantion de 93 de persoane, cu un numar de 20 de medici

Analizand graficul si comparand cu anteriorul (fig. 2), se observa cum rata imbolnavirilor

este mai scazuta (aproximativ 52% fata de aproximativ 74%), iar gripa se raspandeste mai greu.

De asemenea, si numarul de persoane decedate a scazut cu 0.5%, spre deosebire de cazul

anterior.

Dupa cum se observa si din cele doua capturi, pentru aceeasi perioada, riscul

imbolnavirilor scade, daca cei deja bolnavi se trateaza ( "viziteaza" un medic, in cazul de fata).

Page 14: Net Logo

14 | R a s p a n d i r e a g r i p e i i n t r - o c o m u n i t a t e

Fig. 4. Captura pentru un esantion de 69 de persoane, cu un numar mare de medici (20)

Pentru o populatie care are un medic cam la 3.5 persoane, procentajul persoanelor

infectate este relativ scazut, numarul deceselor fiind foarte mic ( 1 singura persoana decedata).

Concluzii

Daca persoanele bolnave de gripa, in cazul de fata, se trateaza, riscul aparitiei unei

epidemii este din ce in ce mai scazut, rata mortalitatii se apropie de 0, iar riscul de imprastiere a

virusului este din ce in mai mic.

Modelul de fata ajuta la analiza transmiterii unui virus banal, dar foarte des intalnit si la

intelegerea modului in care acesta se imprastie, daca nu este tratat ca atare.