Menu Chiudi

Coding e modelli 3/4

Workshop

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.

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).

La funzione PropagaContagio così come può essere costruita con i blocchi del generatore di codice che stiamo usando.
Nella figura qui sopra un semplice programmino scritto (costruito) per testare la funzione che abbiamo appena realizzato. La funzione SituazioneIniziale che abbiamo sviluppato in Coding e modelli 2/4 è utilizzata per le operazioni di avvio del programma di prova.

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.

Ed ecco qui la funzione FineGiornata! Non è altro che un ciclo che scorre la lista degli agenti incrementando il valore di ogni elemento 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.

Il programma che realizza il modello che stiamo costruendo.

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.

Articoli correlati