Puntata precedente: Coding e modelli 3/4. Vedere anche Programmare senza … 1/3 e Introduzione a Blockly, un breve corso per usare subito il generatore di codice di Google.
Ci siamo: il semplice modello per la simulazione di un’epidemia è quasi completo. Non ci rimane che aggiungere una nuova lista in cui, a ogni iterazione del ciclo principale, sarà memorizzato il numero degli infettivi. Successivamente modificheremo la funzione PropagaContagio in modo da controllare se gli agenti assumono lo stato di rimossi (perchè guariti o deceduti).
Gli infettivi day by day
Aggiungiamo qualche istruzione per tenere traccia degli infettivi un giorno dopo l’altro. Dobbiamo creare una lista, inizialmente vuota, a cui aggiungeremo ogni giorno (simulato) un elemento che conterrà il numero degli infettivi attuali. La funzione SituazioneIniziale si deve occupare della creazione della lista mentre la procedura FineGiornata avrà il compito di aggiornarla. È importante notare che la funzione PropagaContagio non deve essere modificata. Questa è una prova della bontà delle scelte che abbiamo fatto finora.
Le modifiche a SituazioneIniziale
SituazioneIniziale(n, infettiviIniziali)
InfettiviStorico = crea una lista vuota
m = crea una lista con n elementi tutti nulli
i = 0
ripeti finchè i < infettiviIniziali
x = numero casuale tra 1 e n
se m[x] == 0 allora
m[x] = 1
i = i+1
ritorna m
Qui sopra lo pseudo-codice della funzione SituazioneIniziale modificata come annunciato. L’unica differenza con quella formalizzata in Coding e modelli 1/4 è la riga InfettiviStorico = crea una lista vuota che predispone la lista che conterrà il numero giornaliero di infettivi.
Le modifiche a FineGiornata
Ora dobbiamo contare gli infettivi attuali e aggiungere un elemento alla lista infettiviStorico per memorizzare questo numero. Ovviamente questa operazione deve essere eseguita al termine di ogni iterazione del ciclo principale e quindi dobbiamo modificare la funzione FineGiornata. Qui di seguito la nuova formalizzazione, in linguaggio quasi-naturale, delle modifiche.
FineGiornata(m)
infettiviOggi = 0
ripeti per i da 1 a lunghezza di m
se m[i] > 0 allora
m[i] = m[i]+1
aumenta infettiviOggi di 1
alla lista infettiviStorico aggiungi infettiviOggi come ultimo elemento
In grassetto sono evidenziati i cambiamenti. La variabile infettiviOggi è usata per contare quanti contagiati ci sono attualmente nella lista degli agenti. Al termine della conta (del ciclo ripeti) si aggiunge il numero ottenuto come nuovo elemento della lista infettiviStorico.