Za preizkus simulatorja (ali ogled kode) kliknite sem!
Raznorazni vplivneži in njihovi globokoumni nasveti so že dolgo časa dražili moj kognitivni organ. Kako odrasel človek z dopolnjeno osemletko danes v Sloveniji razume enostavnega vpliva maske ali pa zmanjševanja števila stikov pove več kot bi si želeli o marsičem. Poglejte si video…
Dejstvo je, da se virus širi. Da več kot imaš stikov, večja je možnost da se okužiš. Torej: možnost okužbe = F(števila stikov). Če imaš gor masko ne širiš aerosole. zaščita ni popolna – daleč od tega, vendar pa maska, ki jo nosi kužni, zmanjša njegovo kužnost za cca 70%, maska ki jo nosi zdrav pa verjetnost okužbe za 30%.
Ker moja draga starejša hči pri računalništvu v šoli heka Scratch in je pogosto “oči, kako bi naredila…” sem ga v zadnje pol leta spoznal tudi sam. Super simpatično in močno orodje. Zakaj ne bi v njem naredil simulacije, kako se COVID giba z raznimi parametri?
Razlaga in omejitve modela
Model je narejen tako, da vsak dan eden med N(=300) ljudmi pride v stik z okuženim (iz ostalega sveta). V Okuzb%(=5%) odstotkih takih stikov pride do okuženja. V roku DniDoNaslednjegaStanja (=3) pride pri 1-Asimpt% (=65%) do obolenja. V roku DniDoNaslednjegaStanja (=3) pride pri Hospitalizacij% (=14%) do namestitve v bolnico. Od nameščenih v bolnico jih Smrtnost% (=15%) umre. Tako “kužen” kot “bolan” širita virus in sicer na VBaloncku (=6) naslednjih ljudi (simulacija balončka družine, okuženi so x,x+1,x+2,x+3,…) in na DrugiStiki (=30) ljudi. Po DniKužen “kužen” ali “bolan” ali “hospitaliziran” človek bodisi ozdravi in postane “imun” ali pa “mrtev”. Z Maske% (=0%) nastavljamo, kakšen odstotek ljudi nosi maske. Maska bo pri oddajniku virusa MaskaOddajnik% (=70%) učinkovita (samo 30% stikov bo poizkušalo okužiti drugega) oziroma MaskaPrejemnik% (=30%) pri prejemniku (70% stikov bo okužilo prejemnika). Možno je simulirati tudi cepljenje: ZačCepljenja (=0 dni) označuje, kdaj se s cepljenjem začne, Cepl/Dan pa koliko ljudi na dan lahko cepimo. Na voljo imamo Cepiv (=100 doz) odmerkov. Če hočemo cepiti že cepljenega potem poiščemo nekoga drugega. Imunost in precepljenost po DniImu (=180 dneh) prenehata in virus lahko ponovno izbruhne.
Referenčne vrednosti v oklepaju sem poizkušal čim bolj približati Covid-u, vzel sem gornje meje vrednosti (upam da pravilnih) tako da situacija teče hitreje. Na videoposnetku sem hitrost povečal za 12x tako da se simulacija za 200 dni odvije v cca 30 sekundah.
Scratch program
Najprej ozadja: uporabili bomo dve. Prvo, označimo jo s “Parametri”, nanjo damo naslov ter navodila. Na njej bo mo pokazali tudi vse parametre, ki jih lahko nastavljamo s smernikom. S pritiskom na tipko “Preslednica” bomo simulacijo pognali. Ozadje se bo zamenjalo na “Simulacija”.
Za lik bomo potrebovali človečka, ki ga narišemo v 7 preoblekah, ki odražajo njegova stanja. Preobleke bomo tako uporabili tudi kot (koristno) lastnost objekta “lik”.
zdrav | kužen | bolan | hospitaliziran | mrtev | cepljen | imun |
Ta lik bomo v kodi N-krat klonirali ter tako ustvarili naše laboratorijske subjekte.
Koda – Ozadje
V kodi za ozadja najprej nastavimo inicializacijo spremenljivk s tipičnimi vrednostmi, nato pa izrišemo drsnike, s katerimi bo uporabnik te vrednosti lahko ponastavljal.
Za njo počakamo na pritisk tipke presledek,ki določenemu procentu ljudi določi maske. Za nameščanje mask ljudem uporabljamo kar preprosto zanko, v kateri najprej nastavimo naključno številko človeka, ki naj masko dobi, nato pa razpošljemo obvestilo “NosiMasko”.
Zadnji sklop kode ozadja pa je delovna – glavna zanka tega programa. Kaj pa dela? V bistvu nič drugega kot uro: poveča števec zaporednega števila Dni ter razpošlje signal DobroJutro vsem likom.
Da pa ne bi bila zanka preveč enostavna, dodajmo notri še signalnik sporočil za cepljenje: 0 dni za začetek cepljenja označuje, da cepili ne bomo. Drugače pa začnemo, ko je dan sistema večji od datuma začetka cepljenja. Takrat ponovi cepi/dan-krat zanko, ki nastavi globalno spremenjljivko “KdoSeCepi” na naključni lik ter objavi sporočilo “Cepi”
Koda – Lik
Z začetkom programa najprej liku nastavimo dve osnovni lastnosti – njegovi osebni (lokalni) spremenljivki MojID ki liku pove njegovo identifikacijsko številko ter NosiMasko, ki označuje ali lik nosi masko ali ne. Da bi imeli dovolj velik vzorec za opazovanje, N-1 krat klonirajmo lik (Scratch lahko klonira do 300x).
Drug del kode se aktivira, ko je klon ustvarjen. Nastavi njegov MojID ter da ne nosi maske. Prestavi ga na njegovo mesto na mreži
Ko prejme lik (katerikoli od klonov) sporočilo “NosiMasko” najprej preveri, če globalna spremenjljivka “KdoSeOkuži” (ker nadevanje mask poteka le enkrat, ni skrbi da bi se spremenljivka polnila v več threadih in lahko uporabimo kar spremenljivko za okuževanje). kaže nanj. Če ja, potem temu liku nadeni masko
Tale dogodek samo prikaže (na prvem ozadju med nastavljanjem parametrov) skriti lik.
Ta delček kode reagira na sporočilo “Cepi” ki cepi določen lik s cepivom. Enako kot vedno za identifikacijo lika uporabimo globalno spremenljivko (KdoSeCepi). Dodaten pogoj poskrbi, da ne cepimo že cepljene – v takem primeru z naključnim številom izberemo nekoga, ki mu predamo cepivo.
Če pa še nismo bili cepljeni se cepimo (spremenimo preobleko) ter zmanjšamo število doze cepiv.
Še pomembna opomba: vsak lik ima lokalno (svojo osebno) spremenljivko DanOsebe, ki označuje datum spremembe stanja (preobleke), tako da lahko računamo inkubacijsko in kužno dobo, imunost, …
Ta delček kode pa okuži lik. Ko prejme sporočilo “Virus” najprej preveri, če je bil on izbran. Če ja, je zdrav? V kolikor je, ima Okuzb% možnosti da se okuži. Ta verjetnost se lahko zmanjša še za 30% v kolikor nosi masko.
Povsod za ugotavljanje praga uporabljamo generator naključnih številk z vrednostmi med 1 in 100. Vrednosti, ki so večje od meje so uspešni dogodki, ostali neuspešni.
Tole bo pa sedaj glavna dnevna koda.
Najprej poglejmo, če je lik “mrtev”. Če je, nimamo kaj več za početi z njim. Če ni, potem preverimo, dali je mogoče “imun” ali “cepljen” ter če je rok imunosti (Dni Imun) že pretekel. V kolikor je, potem mu spremeni videz nazaj v “zdrav”, tako da ga bo možno ponovno okužiti
… sledi preverjanje ali je lik okužen ali bolan.
Če je kužen več kot “Dni Kužen” potem je prebolel in ga označi kot imunega (ter jasno zmanjšaš števec trenutno okuženih).
Če pa še ni prebolel, potem okuži vse, ki živijo z njim v balončku in še “DrugiStiki” naključnih ljudi. Če nosi masko, potem zmanjšaj število poslanih virusov za “MaskaOddajnik%”.
Če je oseba okužena in je v procentu ki ni asimptomatski “Asimptom%”, zboli.
Bolana osebo, ki je v procentu “Hospitalizacij%” likov, ki jih je potrebno hospitalizirati, jo po “Dni Do Nasl Stanja” pošljimo v bolnico.
Če je oseba v bolnici in ima nesrečo da je v procentu “Smrtnost” potem umre.
Če preživi, je lik “imun” za naslednjih “DniImun” dni .