# Simulazione

Nelle scienze applicate per simulazione si intende un modello della realtà che consente di valutare e prevedere lo svolgersi dinamico di una serie di eventi o processi susseguenti all'imposizione di certe condizioni da parte dell'analista o dell'utente. Un simulatore di volo, ad esempio, consente di prevedere il comportamento dell'aeromobile a fronte delle sue caratteristiche e dei comandi del pilota.

## Descrizione

Sono uno strumento sperimentale di analisi molto potente, utilizzato in molti ambiti scientifici e tecnologici dettato dalla difficoltà o impossibilità di riprodurre fisicamente in laboratorio le effettive reali condizioni da studiare e che si avvale delle grandi possibilità di calcolo offerte dai grandi sistemi di elaborazione informatici.
Altro non è infatti che la trasposizione in termini logico-matematica-procedurali di un "modello concettuale" della realtà; tale modello o modello matematico può essere definito come l'insieme di processi che hanno luogo nel sistema reale studiato e il cui insieme permette di comprendere le logiche di funzionamento del sistema stesso. Essa dunque è assimilabile a una sorta di "laboratorio virtuale" consentendo spesso anche un abbattimento dei costi di studio rispetto ad esperimenti complessi realizzati in laboratorio reale.
Diffuso è quindi il suo utilizzo nell'analisi dei sistemi dinamici (semplici o complessi), sia naturali (sistema climatico), sia artificiali (sistemi meccanici e di automazione), sia anche socio-economici (sistema economico). Possono anche avere carattere ludico; oggi esistono sul mercato diversi software (videogiochi di simulazione) che consentono di simulare il comportamento di persone, veicoli, civiltà. Ovviamente il livello di approfondimento di tali simulazioni, in termini di modello concettuale sottostante è più basso.

### Classificazione e paradigmi nella simulazione

Vi sono molteplici tipologie di Simulazione che vale la pena di conoscere per poter rapidamente comprendere il contesto e le caratteristiche fondamentali in essere; alcune di questi criteri sono legati a contesti applicativi specifici, per esempio in ambito scientifico la più tradizionale distinzione è quella legata alla logica di gestione del tempo e corrisponde a Simulazione Continua e Simulazione ad Eventi Discreti: nella prima si fa riferimento ad una logica continua del tempo ancorché elaborata di norma tramite metodi numerici per integrare le equazioni differenziali che regolano le variabili del sistema, mentre nella seconda il tempo evolve tramite eventi e tra questi lo stato delle variabili non ha rilevanza od è direttamente calcolabile; il termine Simulazione Ibrida (o talvolta Combinata) viene viceversa impiegato per definire le simulazioni ove le due logiche operano in modo combinato integrando numericamente le equazioni differenziali tra gli eventi per eliminare buona parte delle discontinuità.
Un altro criterio è legato alla differenza tra Simulazione Stocastica e Simulazione Deterministica in funzione del fatto che l'evoluzione delle variabili e degli eventi sia o meno legata a fenomeni affetti da stocasticità. Un ulteriore criterio è legato al rapporto tra il tempo reale e quello simulato, ovvero Simulazione Real Team (ove un minuto simulato corrisponde ad un minuto nella realtà), Simulazione Fast Time (dove la simulazione evolve più rapidamente della realtà e si possono simulare mesi e anni in poco tempo) o Simulazione Slow Time (nella quale serve più tempo per completare i calcoli della simulazione di quanto ne trascorra nella realtà); in realtà abbiamo anche la distinzione tra Simulazione Paced (ritmata) e Unpaced nel caso che gli intervalli di tempo sul simulatore siano proporzionali a quelli nella realtà (il caso specifico 1:1 corrisponde alla Simulazione Real Time) oppure che non vi sia correlazione fra il tempo simulato (regolato dalla mole computazionale generata nell'esecuzione sul computer) rispetto a quello reale.
Un altro importante criterio è legato alla presenza di entità che interagiscano con la simulazione: Simulazione Man-in-the-Loop prevede l'interazione con persone (e.g. simulatore di volo guidato da un pilota), Simulazione Hardware-in-the-Loop include anche componenti fisiche nella simulazione (e.g. un sistema di allarme laser reale sollecitato da un generatore di segnali che interagisce dinamicamente con il simulatore), Simulazione Software-in-the-Loop ove un software reale interagisce con il simulatore (e.g. il sistema reale di controllo di un drone che interagisce con il relativo simulatore); in impianti industriali si parla spesso di Emulazione quando il Simulatore è integrato con i sistemi di controllo e serve per verificarne le logiche e le modalità di funzionamento. Altro importante criterio è legato alla modalità di esecuzione: Stand-Alone (simulazione su una singola macchina isolata), Distribuita (Simulazione che opera su più computer che interagiscono), Parallela (simulazione che opera su più processori in parallelo), Simulazione Interoperabile (simulazione over più modelli interagiscono localmente o in modo distribuiuto): vale la pena di citare anche i seguenti paradigmi MSaaS (Modeling & Simulation as a Service ovvero accesso al simulatore come servizio sulla rete), Web Based Simulation (Simulazione che opera come web application). Un ulteriore criterio è legato all'integrazione con altri sistemi ed in particolare di intelligenza artificiale, spesso si fa riferimento a simulazione Ibrida anche come Simulazione Connessa con AI (Intelligenza Artificiale) che ne dirigono l'evoluzione o più specificatamente a Simulazione Guidata da Agenti o Simulazione ad Agenti nel caso di integrazione con Agenti Intelligenti.
Un'ulteriore classificazione è legata al contesto della Difesa dove si distingue tra Simulazione Live (ove sistemi reali sono usati da persone reali, il tutto integrato in una simulazione come nel caso di due caccia che ingaggiano un combattimento aereo "sparando" missili e proiettili nella simulazione che valuta anche i danni e l'efficacia delle contromisure), Simulazione Virtual (dove persone reali operano sistemi virtuali come nel caso del simulatore di guida di un'auto), Simulazioni Constructive (dove persone virtuali operano su sistemi virtuali come nel caso di un war game); queste classificazioni possono essere combinate creando simulatori Virtual & Constructive oppure LVC (Live, Virtual & Constructive); sotto questo profilo vale la pena anche di citare il paradigma MS2G (Modeling, interoperable Simulation & Serious Games) dove si combinano le logiche e gli strumenti tipici dei Serious Games con quelle di interoperabilità dei Simulatori. Infine bisogna ricordare che spesso si usa il termine Simulazione al posto di Simulazione al Computer, ma viceversa esistono anche Simulazioni Fisiche (e.g. vasca per addestrare gli astronauti ad operare in assenza di peso, oppure modelli in scala di navi e dighe per simulazioni idrauliche, oppure simulazione con manichini per analisi di crash su veicoli) che sono ancora in uso ed un tempo erano molto comuni.

### Simulazione di processi produttivi

Nell'ambito delle simulazioni, acquisisce notevole importanza la simulazione del funzionamento dei processi produttivi e logistici. Tali sistemi sono infatti caratterizzati da elevata complessità, numerose interrelazioni tra i diversi processi che li attraversano, guasti dei segmenti, indisponibilità, stocasticità dei parametri del sistema. Consideriamo, ad esempio, un impianto semplice per la produzione di un unico articolo, con solamente due macchine automatiche ed imballaggio manuale; in questo semplice sistema l'arrivo delle materie prime, la durata delle lavorazioni, il tempo necessario agli operatori per imballare sono tutte variabili stocastiche, in quanto il ritmo produttivo e di arrivo non è costante; inoltre, le macchine sono soggette a guasti e manutenzione, gli operatori possono non essere sempre disponibili etc.
Il progettista degli impianti industriali e il responsabile delle operations possono certamente avere interesse a valutare con anticipo l'effetto delle loro scelte su tali sistemi complessi, in termini, ad esempio, di capacità di produzione, tempo di attraversamento, scorte, blocchi. Possono inoltre avere dei problemi riguardo al dimensionamento di macchine, magazzini, flotta dei carrelli trasportatori e simili.
La simulazione, consentendo l'analisi della realtà a un elevato livello di dettaglio e padroneggiando facilmente la complessità del sistema, fa sì che alla fine sia possibile ottenere un gran numero di informazioni utili. Il prezzo da pagare per tale completezza è ovviamente il tempo; le operazioni di programmazione sono infatti assai lunghe, affinché si possano ottenere dei dati sufficientemente sensati e tali da dare la possibilità di ottenere un modello della realtà ad essa aderente.

#### Passi e procedure

Al fine di poter procedere correttamente per avere un modello di simulazione utile e funzionante è opportuno procedere con una serie di passi:
* Definizione degli obiettivi e delle problematiche da esaminare: un'attenta analisi del problema consente di circoscriverne l'esame riducendo il successivo tempo di analisi;
* Stesura di un modello concettuale: consiste nella comprensione e modellazione del sistema produttivo che si intende simulare; questa fase è particolarmente importante in quanto definirà il comportamento dei diversi flussi di materiale e di informazioni che attraverseranno il modello.
* Validazione del modello concettuale: si tratta di un confronto con la direzione dell'impresa e con gli operatori per assicurarsi della capacità del modello di offrire un'immagine consistente della realtà.
* Analisi dei dati in ingresso: la raccolta e l'analisi dei dati che diverranno la base per la definizione dei parametri di funzionamento del sistema (ad esempio: i diversi tempi di lavoro di una singola macchina). Attraverso le tecniche del calcolo delle probabilità diviene possibile definire una distribuzione di probabilità per ogni parametro, da inserire all'interno del modello.
* Scrittura del modello in termini matematici
* Calibrazione e valutazione
* Definizione di un piano degli esperimenti: una singola iterazione ("run") di simulazione non ha alcun significato; rappresenta solo una delle possibili evoluzioni del sistema. È quindi opportuno effettuare diversi "run" per poi analizzare i parametri in uscita. La lunghezza della singola iterazione e il numero delle iterazioni vengono determinate in questa fase.
* Analisi dei dati in uscita: dopo aver raccolto i dati relativi ai parametri, depurati da eventuali transitori è possibile creare degli intervalli di confidenza ovvero stimare il "range" di valori in cui i parametri che analizzano il problema proposto al primo passaggio possono oscillare.

#### Elementi caratteristici di un modello di simulazione

* Entità - Le entità sono gli elementi "trattati" dal processo; tali "oggetti" hanno la caratteristica di essere "temporanei", e di subire passivamente le trasformazioni. Ad esempio, in un'impresa di lavorazioni meccaniche, i semilavorati e le materie prime, che devono essere fresati, spianati etc possono essere modellizzati come "entità". Naturalmente, è possibile simulare anche processi in cui la produzione non riguardi un bene fisico, ma un servizio: in questo caso, le entità rappresenteranno informazioni, documenti, clienti, a seconda delle necessità.
Le entità, all'interno del modello, possono essere considerate a loro volta come:
   * Anonime - Nella maggior parte dei casi, non interessa tenere traccia del singolo pezzo in lavorazione o in generale in transito nel sistema. Pertanto le entità non sono caratterizzate, e vengono considerate come un "flusso" indistinto.
   * Personalizzate - Caso duale del precedente, si presenta quando l'analista, spesso per il numero esiguo di pezzi in lavorazione, ha interesse a considerare i parametri di lavorazione del singolo pezzo.
* Operazione: rappresenta una delle trasformazioni che avranno luogo sull'entità.
Possono essere individuati due cicli di operazioni:
   * Il ciclo macchina: attinente agli stati (vedi) ed operazioni che la macchina attraverserà, ovvero l'insieme di tutte le possibili successioni di operazioni e attese.
   * Il ciclo pezzo: rappresenta il percorso delle entità nel sistema, le macchine visitate e le operazioni subite
* Macchine: rappresentano gli elementi "fissi" del sistema, la cui definizione degli stati definisce univocamente la situazione generale del sistema, e delle quali sono di rilevanza per l'analista soprattutto le prestazioni. Le macchine possono essere fisiche, ed in questo caso ci si riferisce a macchine realmente presenti nel sistema da modellizzare, o "logiche", ed in questo caso compiono operazioni "fittizie" fisicamente, ma presenti logicamente nel sistema (ad esempio, il controllo di quantità in ingresso nell'impianto non ne provoca trasformazioni "fisiche" ma lo "trasforma" da "lotto da controllare" a "lotto controllato").
* Stati: gli stati sono delle variabili (di tipo vario: possono essere numeri o valori logici) che descrivono lo stato del sistema e delle sue componenti, per ogni istante di tempo.
* Eventi: fenomeni che modificano lo stato del sistema (ad esempio, la fine di una lavorazione modifica lo stato di una macchina da "occupata" a "libera").
* Code: insiemi di entità che non possono accedere alle trasformazioni successive in quanto la macchina risulta occupata.
* Attributi: proprietà permanenti di un insieme di entità o di una macchina.
* Orologio locale: orologio che contiene, a livello di singola macchina, l'istante di tempo che identifica la fine della lavorazione in corso.
* Orologio generale: orologio che regola lo scorrere generale del tempo di simulazione.

#### Funzionamento dei simulatori

* Fase di scan
* Fase di rescan

##### Tipi di simulatori

* Orientati agli eventi
* Orientati ai processi
* Orientati alle attività

### Aspetti implementativi: programmazione del modello

Una volta costruito il modello esso va tradotto in un programma su calcolatore. È possibile usare linguaggi general purpose quali Fortran, Pascal, C, C++, per i quali esistono delle librerie di routine orientate alla simulazione. Esistevano anche diversi linguaggi specializzati quali ad esempio SIMSCRIPT, MODSIM e GPSS. Un'interessante alternativa è quella di ricorrere ad applicazioni di tipo interattivo per la simulazione, fra gli altri: AutoMod, Simul8, Arena Simulation, Simio, AnyLogic, Witness, Extend e Micro Saint. Tali applicazioni sono di facile uso e quindi molto adatte a costruire rapidamente modelli, anche sofisticati, ma sono meno versatili e potenti dei linguaggi specializzati o di quelli general purpose. Per problemi di piccole dimensioni è anche possibile usare strumenti informatici di uso comune quali le spreadsheet. Tali strumenti possono essere utili quando si vuole rapidamente avere un'idea del funzionamento di una singola componente o di un sottosistema di un sistema complesso.