Puntata precedente: Coding e modelli 2/4. Vedere anche Programmare senza … 1/3 e Introduzione a Blockly, un breve corso per usare subito il generatore di codice di Google.
Terza parte della costruzione di un semplice modello per le epidemie. In questo articolo ci occuperemo di formalizzare meglio le istruzioni che controllano la propagazione del contagio, fino a implementare una funzione apposita con Blockly, e precisare le operazioni da compiere alla fine di ogni giornata simulata.
Raccogliamo in una funzione tutte le istruzioni che controllano gli incontri degli agenti e l’eventuale passaggio della malattia da un individuo all’altro.
PropagaContagio(m, lambda, contatti, persona)
ripeti per il numero di contatti
q = numero casuale tra 1 e la lunghezza di m
se numero casuale <= lambda
se m[persona] > 0 e m[q] = 0
m[q] = 1
altrimenti se m[persona] = 0 e m[q] > 0
m[persona] = 1
La funzione si chiama PropagaContagio e, tra i parametri, fa la sua prima apparizione il tasso di contagio λ che serve per decidere se il suscettibile che incontra l’infettivo si ammala. Il parametro (della funzione ma anche del modello) contatti determina il numero di incontri che l’individuo in esame, indicato dal parametro persona, ha ogni giorno (simulato).
Una terza stesura del programma
A questo punto possiamo riscrivere l’intero algoritmo nascondendo i dettagli della propagazione del contagio nella funzione apposita.
m = SituazioneIniziale(individuiTotali, infettiviIniziali)
ripeti per un certo numero di giorni
ripeti per k da 1 a lunghezza di m
PropagaContagio(m, lambda, contatti, persona)
FineGiornata(m)
Abbiamo aggiunto una funzione – FineGiornata(…) – che si deve occupare delle operazioni alla fine di ogni iterazione del ciclo principale (in altre parole, al termine di ogni giorno della simulazione). Ora dobbiamo formalizzare meglio queste operazioni.
Le operazioni di aggiornamento
In sostanza, per ora si tratta solo di aumentare di uno il valore dello stato di ogni individuo contagiato. Infatti, in Coding e modelli 1/4, abbiamo scelto di indicare con un numero positivo lo stato di infettivo, con il valore che indica proprio l’intervallo di tempo trascorso dall’infezione.
FineGiornata(m)
ripeti per i da 1 a lunghezza di m
if m[i] > 0 allora
m[i] = m[i]+1
Piuttosto semplice: si tratta di aumentare di uno lo stato di ogni agente a cui corrisponde un valore positivo.
Implementiamo la terza stesura con Blockly
Il programma inizia ad avere l’aspetto definitivo. Alla versione precedente dobbiamo aggiungere la chiamata alla funzione FineGiornata e avremo un modello funzionante e quasi definitivo.
Manca ancora un ultimo passo: dobbiamo fare in modo di tracciare il numero di infettivi giorno per giorno in modo da poter analizzare, rappresentare e studiare i risultati della simulazione. È quello che faremo nell’ultimo step della simulazione: Coding e modelli 4/4.