"Das ganze tschechische
Volk ist eine Simulantenbande"
Jaroslav
Hašek: Il buon soldato Švejk
Cos'è la simulazione
Simulazione continua
Simulazione discreta
Simulazione orientata agli oggetti
Simulazione in linea
Riferimenti
Al livello più generale, la simulazione
dovrebbe essere considerata una forma di cognizione. (Cognizione = azione o processo di acquisizione di
conoscenza.) Ci sono tre metodi di base su come ottenere un'informazione
(conoscenza) della realtà oggettiva: Esperimento, Analisi,
Simulazione.Facciamo un esempio pratico per dimostrare la natura di questi tre
metodi. Il sistema oggetto
di indagine è una stazione di servizio con un assistente. La domanda
è "qual è il tempo medio trascorso da una macchina nella
stazione di servizio". Per ottenere la risposta abbiamo tre
possibilità:
Esperimento : prendi i cronometri e misura il tempo trascorso
da ogni auto nella stazione. Contare le auto, alla fine sommare tutte le volte e
dividerle per il numero di auto.
Analisi : utilizzare una formula della teoria della coda
per calcolare direttamente il tempo medio trascorso nel sistema. Per usare una formula
dovrai assumere un certo modello di accodamento che significa una notevole
semplificazione del sistema reale e avrai bisogno di alcuni parametri
quantitativi (qui intensità di arrivo - numero di auto in arrivo per
unità di tempo e intensità di servizio - numero di auto servite
per volta unità).
Simulazione : scrivere un modello di simulazione che genera
arrivi casuali di automobili e durata dei servizi. Deve anche eseguire correttamente in sequenza tutte le
attività per avere una corrispondenza uno a uno con il sistema reale. Anche
l'osservazione, la raccolta di dati statistici e la valutazione devono essere
programmati (per ogni auto calcolare il tempo trascorso, accumulare questi
tempi, contare il numero di automobili, calcolare e visualizzare la media).
Questi tre metodi non possono essere classificati
perché tutti hanno vantaggi e svantaggi. Possono essere confrontati solo nel contesto di
determinati casi particolari tenendo conto di vari criteri. Tuttavia alcuni
fatti di base sono ovvi:
L'esperimento è sempre il metodo più accurato,
che dovrebbe essere usato ogni volta che è fattibile. Sfortunatamente
molto spesso l'esperimento è:
- Troppo pericoloso (comportamento di un reattore
nucleare in situazioni critiche, atterraggio con un aereo con un getto spento,
ecc.)
- Troppo costoso (tutti i casi che causano un danno,
lunghi esperimenti che studiano il throughput di una rete di dati utilizzando
linee telefoniche dedicate, ecc.)
- Non è possibile se il sistema oggetto di
indagine non è disponibile (valutazione di più alternative
possibili in fase di progettazione).
L'analisi (principalmente matematica) è tipicamente
basata su ipotesi forti che raramente sono vere nella vita pratica. Un altro possibile
inconveniente dei metodi analitici è l'utilizzo di apparecchiature
troppo complicate e / o il calcolo troppo lungo. Un esempio di ciò è l'analisi delle reti
di accodamento. D'altra parte l'utilizzo di formule fornisce risultati per lo più
veloci ed è possibile controllare un gran numero di alternative semplicemente
inserendo diversi valori di parametri nella formula (e). I metodi
sperimentali richiedono molto più tempo. Un altro problema di analisi è la
disponibilità dei parametri necessari. Anche la loro misurazione esatta non è
necessariamente fattibile o è impossibile in fase di progettazione. L'uso di dati
stimati o dati presi da altri sistemi simili diminuisce la credibilità
dei risultati.
La simulazione è anche un metodo sperimentale. Invece di
sperimentare con il sistema reale, gli esperimenti vengono eseguiti con il
modello di simulazione (il cui design è quindi il punto chiave degli
studi di simulazione). Anche la simulazione ha molti svantaggi. Ecco i più
importanti:
- Creazione troppo impegnativa di modelli di
simulazione. Programmare
modelli di simulazione in lingue generali (come Pascal) è troppo
difficile. Esistono linguaggi
di simulazione efficienti ma la loro padronanza rappresenta un grande
investimento iniziale non sempre giustificato. Esistono strumenti di simulazione basati tipicamente
su alcune tecniche grafiche che semplificano o addirittura automatizzano la
creazione di modelli di simulazione di determinate classi di sistemi. Se vuoi saperne di più su uno di questi strumenti, vai alla
pagina Petri Nets .
- Conoscenza limitata del sistema che viene simulato. Prima di tutto
devono essere noti alcuni parametri quantitativi. Nell'esempio sopra è necessario generare
intervalli casuali tra arrivi e tempi di servizio casuali. Qui la simulazione
è molto più flessibile dell'analisi - i linguaggi di simulazione
supportano la generazione di numeri casuali praticamente con qualsiasi
distribuzione. Nell'esempio
precedente entrambe le cifre casuali possono essere basate su qualsiasi
distribuzione (ad es. Ottenuta sperimentalmente). Tuttavia, qualsiasi distribuzione necessita di diversi
parametri (se è teorica) o direttamente della funzione di distribuzione
(se la distribuzione viene ottenuta misurando). Possono esserci anche cose nel sistema (tipicamente in
fase di progettazione) che non possono essere quantificate e spesso è
necessario accettare il fatto che potrebbero esserci degli aspetti di cui non
siamo affatto a conoscenza.
- Calcolo troppo lungo. Un esempio è l'analisi di sistemi su larga
scala con molti componenti che lavorano in parallelo. Poiché l'applicazione del parallelismo reale
non è ancora comune, tali sistemi sono simulati da un programma eseguito
da un singolo processore. Le attività parallele vengono quindi eseguite
una alla volta (anche se l'utente ha un'impressione di parallelismo e durante
la progettazione del modello di simulazione "pensa in parallelo"). Il risultato di
ciò è il fatto che la simulazione potrebbe essere molto
più lenta del tempo reale (1 secondo del tempo di modello impiega 10
minuti del tempo della CPU). Ciò ovviamente disabilita l'applicazione della
simulazione in controllo in tempo reale.
Una regola empirica generale potrebbe
essere così:
"Se l'esperimento è fattibile, usalo,
è sempre il metodo migliore perché tutti gli aspetti sono presi
in considerazione, anche se sono stati utilizzati altri metodi durante la fase
di progettazione, l'esperimento può servire come valutazione finale del
sistema. non è possibile provare a trovare un metodo analitico
appropriato, se non è disponibile, utilizzare la simulazione. "
La simulazione non è solo l'ultima risorsa come
sembra nella regola precedente. La simulazione può contribuire molto alla
comprensione del sistema che viene analizzato non solo fornendo risposte alle
domande originariamente fornite. Molto spesso la creazione del modello di simulazione
è la prima occasione in cui alcune cose vengono prese in considerazione. Le specifiche del
sistema simulato possono (e spesso lo fanno) rivelare errori o ambiguità
nella progettazione del sistema. Quindi la simulazione può aiutare molto
evitando futuri aggiornamenti costosi del sistema pronto.
Torna a Intestazione
Torna alla Home page
Linguaggi di simulazione continua sviluppati alla fine
degli anni Cinquanta come simulatori di computer analogici. La simulazione su
computer analogici si basa sulla creazione di un sistema elettronico analogico
il cui comportamento è descritto dallo stesso modello matematico
(insieme di equazioni differenziali) del sistema oggetto di indagine. Il sistema
elettronico è creato collegando blocchi standard basati principalmente
su amplificatori operazionali modificati per fungere da integratori, sommatori
e altre unità funzionali. Quindi l'utente esegue esperimenti con questo sistema
elettronico applicando opportuni ingressi e registrando la tensione in
determinati punti di uscita (oscilloscopio, plotter). La tensione variabile rappresenta una funzione
temporale, che è la stessa della funzione che descrive i cambiamenti nel
sistema originale la cui natura fisica può essere totalmente diversa
(spostamento meccanico, temperatura, ecc.). Il problema principale dei computer analogici è
un'implementazione analogica di alcune operazioni come la moltiplicazione, la
generazione di alcune funzioni, la generazione di ritardi e altri. I computer
digitali eseguono tutte queste funzioni molto facilmente e oggi la simulazione
continua viene eseguita solo su di essi. Tuttavia c'è una operazione in cui i computer
analogici sono migliori - integrazione. I computer digitali utilizzano un'integrazione
numerica generalmente più lenta e meno accurata rispetto
all'integrazione di un integratore analogico. Alcune applicazioni speciali basate sulla risposta
rapida utilizzano quindi i cosiddetti computer ibridi, che contengono parti
analogiche e digitali collegate da convertitori A / D e D / A. La parte digitale
fa tutto tranne l'integrazione. Calcola gli input degli integratori, che vengono
quindi convertiti da convertitori D / A in segnali analogici immessi in
integratori analogici. Le loro uscite sono trattate in modo opposto. La parte digitale
controlla anche l'interconnessione della parte analogica, che potrebbe quindi
cambiare durante il calcolo.
Classificazione
delle lingue di simulazione continua
I linguaggi di simulazione
orientati ai blocchi si basano
sulla metodologia dei computer analogici. Il sistema deve essere espresso come un diagramma a
blocchi che definisce l'interconnessione delle unità funzionali e i loro
parametri quantitativi. "Programmazione" significa inserire
l'interconnessione dei blocchi e la loro descrizione. Quindi l'utente aggiunge istruzioni e / o direttive
che controllano la simulazione. Se il sistema è descritto come un insieme di
equazioni, devono essere convertite in un diagramma a blocchi. Questa conversione
è un processo semplice e diretto.I blocchi tipici disponibili nella
maggior parte dei linguaggi orientati ai blocchi sono integratori, limitatori,
ritardi, moltiplicatori, isteresi, valori costanti, sommatori, titolari,
guadagno (coefficiente) e altro.
I linguaggi continui orientati
all'espressione si basano su espressioni
di scrittura (equazioni) che rappresentano il modello matematico. Quindi il sistema
simulato deve essere espresso da un insieme di equazioni. Quindi l'utente
aggiunge istruzioni e / o direttive che controllano la simulazione.Alcuni linguaggi
abilitano sia metodi di definizione di sistema basati su blocchi che
espressioni. Controllo della
simulazione significa selezione di: il metodo di integrazione (perché
alcuni linguaggi offrono di più), il passo di integrazione, le variabili
(uscite di blocchi) che devono essere osservati, gli intervalli per la raccolta
dei dati per la stampa e / o la stampa, il ridimensionamento delle uscite (che
può anche essere eseguito automaticamente), la durata delle esecuzioni
di simulazione, il numero di ripetizioni e il modo in cui determinati valori
vengono modificati in essi, ecc.
Scarica il file model1.zip che contiene diversi modelli di simulazione
continua scritti in linguaggio Turbo Pascal. I modelli vengono creati utilizzando un semplice
ambiente di simulazione continuo basato sull'approccio orientato
all'espressione e possono essere facilmente modificati per modellare qualsiasi
altro sistema descritto dalle equazioni differenziali.
Torna a Intestazione
Torna alla Home page
La simulazione discreta si occupa di sistemi la cui
dinamica può essere considerata (a causa del livello di astrazione) come
una sequenza di eventi a punti di tempo discreti. Il punto chiave di un linguaggio di simulazione
discreto è il modo in cui controlla il corretto sequenziamento delle
attività nel modello. Questo è anche il modo in cui un utente deve
"vedere il mondo" quando usa la lingua e una base per la
classificazione dei linguaggi di simulazione discreti.
Classificazione
dei linguaggi di simulazione discreti
Le lingue orientate al
diagramma di flusso sono
rappresentate dalla lingua GPSS (General Purpose Simulation System), che esiste
in molte versioni su vari computer. L'utente deve visualizzare le dinamiche del sistema
come un flusso delle cosiddette Transazioni attraverso uno
schema a blocchi. Le transazioni vengono generate, seguono un percorso attraverso una rete di
blocchi e vengono distrutte all'uscita. Nei blocchi le transazioni possono essere ritardate,
elaborate e passate ad altri blocchi. I blocchi sono nel programma rappresentati da
istruzioni che eseguono le attività del modello.
I linguaggi orientati
all'attività non sono
basati su una pianificazione esplicita delle attività future. Per ogni
attività l'utente descrive la condizione in cui può avvenire
l'attività (che copre anche la pianificazione se la condizione raggiunge
un certo tempo). L'algoritmo del controllo di simulazione incrementa ripetutamente il tempo
e verifica le condizioni di tutte le attività. Lo svantaggio di questo approccio è ovvio:
è necessario valutare tutte le condizioni in ogni fase, che può
richiedere molto tempo. D'altra parte è concettualmente molto semplice
e l'algoritmo può essere facilmente implementato in linguaggi generali
di alto livello (esistono linguaggi di simulazione basati su questo approccio,
ma non ampiamente utilizzati). Scarica il file model2.zip che contiene due modelli di un semplice sistema di
accodamento (in Turbo Pascal) che dimostrano l'approccio orientato
all'attività. Questi modelli sono accompagnati da diverse unità che implementano
operazioni su liste collegate bidirezionali che vengono successivamente
utilizzate per implementare stack e code.
I linguaggi orientati agli
eventi sono basati sulla pianificazione diretta e sulla
cancellazione di eventi futuri. L'approccio è molto generale. L'utente deve
visualizzare le dinamiche del sistema simulato come una sequenza di eventi
relativamente indipendenti. Ogni evento può programmare e / o cancellare
altri eventi. La routine di
sistema deve tenere traccia degli eventi programmati. Ecco perché ogni evento è rappresentato
dalla cosiddetta notifica di evento, che contiene l'ora, il tipo di evento e
altri dati dell'utente. Le notifiche degli eventi sono conservate nel
cosiddetto Calendario, dove le notifiche degli eventi sono ordinate in base
all'orario pianificato. Dopo il completamento di una routine di evento, il
sistema rimuove l'avviso di evento con il tempo minore dal calendario, aggiorna
l'orario del modello in base alla sua ora e avvia la routine corrispondente. Questo viene
ripetuto fino a quando il calendario non è vuoto o il programma si ferma
a causa di altri motivi. Pianificazione significa inserire avvisi di eventi nel
calendario entro il tempo pianificato, la cancellazione li rimuove. L'approccio basato
sull'espressione esplicita di eventi è chiamato simulazione dell'evento
discreto, che a volte è generalizzata alla simulazione discreta in
quanto tale. Un tipico rappresentante di questo gruppo di lingue
è la lingua SIMSCRIPT (ma la sua
versione II.5 supporta anche la simulazione orientata al processo).
I linguaggi orientati al
processo si basano sul fatto che gli eventi non sono
indipendenti. Un evento è
in genere una conseguenza di altri eventi precedenti. In altre parole, è spesso possibile definire
sequenze di eventi che possono essere visualizzati come entità di un
modello di simulazione a un livello superiore di gerarchia. Una sequenza di
eventi si chiama Process . A differenza del processo degli eventi ha una
dimensione nel tempo. I sistemi astratti basati sui processi sono molto
vicini alla realtà, che è sempre composta da vari oggetti che
esistono e agiscono in parallelo interferendo l'uno con l'altro. Il modo di vedere
la dinamica del sistema è quindi molto naturale. Principalmente un processo modella un'attività
di un oggetto reale. Si ritiene che la simulazione discreta orientata al processo sia il modo
migliore per creare modelli di simulazione discreti.Rappresentanti tipici di
questo gruppo di lingue sono MODSIM, SIMSCRIPT II.5 e SIMULATION della lingua
di sistema del linguaggio Simula .
Torna a Intestazione
Torna alla Home page
Simulazione orientata agli oggetti
La simulazione orientata agli oggetti (OOS) può
essere considerata un caso speciale di programmazione orientata agli oggetti
(OOP). Alcuni principi di
OOP come l'esistenza di un numero variabile di istanze di oggetti interferenti
sono stati in uso standard nell'ambiente di simulazione per lungo tempo, spesso
usando altra terminologia. Il linguaggio Simula (che si chiamava Simula 67)
è il primo vero linguaggio orientato agli oggetti. Avendo più
di 30 anni, ha ancora la maggior parte (e tutti i principali) meccanismi e
principi dell'OOP. Alcune cose come classi, ereditarietà, metodi virtuali, ecc. Sono
state definite in Simula molto tempo prima che venissero riscoperte dal boom
dell'OOP negli ultimi anni. Per saperne di più su Simula, visitare la
pagina di ASU (Associazione
utenti Simula). Puoi anche consultare il
documento Introduzione a OOP in Simula basato su un discorso presentato all'Università di Malta in
occasione del 30 anniversario della Simula. MODSIM è un altro linguaggio di simulazione
orientato agli oggetti.
Queste sono le
caratteristiche più comunemente accettate di OOS:
1. L'algoritmo o la dinamica del sistema sono espressi
in termini di oggetti (attori) che esistono in parallelo e che interagiscono
l'uno con l'altro. Ogni oggetto è rappresentato da:
- parametri (che possono essere assegnati valori reali
durante la generazione di oggetti)
- attributi (chiamati anche attributi interni o
attributi di valore)
- metodi (chiamati anche attributi di azioni o
procedure)
- la vita, che rappresenta l'attività avviata
alla creazione dell'oggetto.
Gli oggetti possono interagire in questi modi:
- accesso diretto a parametri e attributi
- chiamata reciproca di metodi
- comunicazione e sincronizzazione di oggetti vivi.
Semplicemente parlando: Object = Data + Procedure che
si chiama Incapsulamento . Molto spesso i dati dell'oggetto o parte di esso sono
nascosti e i valori sono accessibili e modificati solo tramite metodi (ben
definiti). Questo concetto
è chiamato nascondere informazioni .
2. Oggetti simili (attori) sono raggruppati nelle
cosiddette classi chiamate anche prototipi. Una classe
descrive oggetti che hanno gli stessi parametri, attributi, metodi e vite. Una dichiarazione
di classe è interpretata come un modello. È possibile creare un numero qualsiasi di
singoli oggetti (attori) chiamati istanze di oggetti . Le istanze possono
differire nei valori dei loro parametri e / o attributi. È
necessario fare una chiara differenza tra una classe in quanto tale e le
istanze dell'oggetto generate utilizzando la dichiarazione di classe. Una classe
può anche essere interpretata come una conoscenza di determinati tipi di
oggetti. Tale conoscenza
è rappresentata da una parte di dati e da operazioni che possono essere
eseguite sui dati. Questo è simile ai tipi di dati astratti, ma le classi sono molto
più ricche. Un tipo di dati astratto può essere considerato in questo contesto
come un caso degenerato di una classe che non fa uso dell'ereditarietà.
3. Gli oggetti possono essere classificati
gerarchicamente dalla cosiddetta ereditarietà . Molto spesso viene
introdotto il termine sottoclasse . Una sottoclasse Y di una classe X eredita tutti i
parametri, attributi e metodi dalla classe X. La sua dichiarazione può
aggiungere qualsiasi numero di parametri, attributi e metodi aggiuntivi. Una sottoclasse
può anche aggiungere alcune attività alla vita della classe
genitore. Una sottoclasse
può essere utilizzata come classe genitore di altre sottoclassi, ecc.
Alcuni linguaggi OOP (non Simula) abilitano la cosiddetta ereditarietà
multipla . In questo caso una sottoclasse può ereditare da più di una
classe genitore. Una sottoclasse può essere interpretata come una conoscenza
più dettagliata di quella definita dalla classe genitore. Quindi la classe
genitore rappresenta una conoscenza generale, che può essere
ulteriormente specializzata da dichiarazioni di sottoclassi in qualsiasi numero
di passaggi. L'ereditarietà
agisce in un certo modo contro una forte tipizzazione di lingue come Pascal. In genere è
possibile dichiarare variabili di riferimento che possono riferirsi a
un'istanza di una determinata classe e alle istanze di tutte le sue
sottoclassi. Potrebbe essere
auspicabile che determinati metodi si comportino in modo diverso a seconda
dell'istanza oggetto corrente a cui si fa riferimento, che potrebbe cambiare
dinamicamente durante l'esecuzione del programma. Questo concetto chiamato polimorfismo è
supportato dal meccanismo chiamato late binding e i metodi coinvolti sono
chiamati metodi virtuali, che possono cambiare a ogni livello della gerarchia.
4. L'esistenza parallela di istanze di oggetti
richiede strutture che supportino la cooperazione e la sincronizzazione delle
loro vite. La vita
dell'oggetto non ha necessariamente una dimensione temporale, ma nel caso di
OOS lo ha. Gli oggetti Simula
come tali possono interagire senza la nozione di tempo. La classe di sistema Simula SIMULATION definisce la
classe "Processo" la cui vita esiste nel tempo. Ci sono strutture
per i processi di comunicare e sincronizzare le loro vite
Torna a Intestazione
Torna alla Home page
Internet insieme a Java e JavaScript offrono
incredibili possibilità di risoluzione dei problemi. Invece di perdere
tempo a scaricare e installare pacchetti software, è possibile aprire
direttamente vari solutori, soprattutto per problemi che non sono frequenti e
che non richiedono un calcolo dispendioso in termini di tempo. Come primo passo
in questa direzione, ho scritto semplici modelli di simulazione in JavaScript
che risolvono e simulano sistemi a coda singola e reti di accodamento. Procedi alla pagina Solutori e simulatori online per
provare subito la simulazione.
Torna a Intestazione
Torna alla Home page
Questa pagina contiene un estratto dal testo:
Sklenar, J .: Simulation (Università di Malta, 2000) che viene
utilizzato in diversi corsi relativi alla ricerca operativa insegnati
all'Università di Malta.
Puoi anche trovare un sacco di cose su Internet
perché tutti i motori di ricerca restituiscono molte voci su
"simulazione". Puoi iniziare con i seguenti luoghi, che contengono
altri collegamenti, riferimenti, informazioni su istituzioni, conferenze, ecc.
- AIS AI & Simulation Research Group
- Riflessioni su OutSights
- Informa il College sulla simulazione
- DIRO casa Simula
- EUROSIS
- EUROSIM
- Società per la modellazione e simulazione internazionale
Torna a Intestazione
Torna alla Home page