SlideShare a Scribd company logo
1 of 108
Download to read offline
Magazzino pezzi da  lavorare LABORATORIO DI SIMULAZIONE Molinari Davis Esercizio per la parte pratica dell’esame Sistema da simulare
PRIMA PARTE “  Nella prima fase si dovr à  analizzare il sistema e si dovranno definire (sulla carta) le variabili di stato, gli eventi - distinguendo quelli incondizionati, che dovranno essere memorizzati nella FEL da quelli condizionati, trattati in seguito al verificarsi di un cambiamento di stato causato da un evento incondizionato, le procedure per il trattamento degli eventi, gli accumulatori per il calcolo degli indici di prestazione. “
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],DA QUESTE CONSIDERAZIONI SON ARRIVATO AI FLOW-CHART PRESENTI NELLE PAGINE SEGUENTI
GESTIONE DELL’EVENTO DI SCARTO DI UN PEZZO (EVENTO CONDIZIONATO) Per vedere se un pezzo è da scartare o meno faccio così: Definisco, con una #define, all’inizio del programma una costante simbolica che indica quale è la probabilità che il pezzo venga scartato e che potrà chiamarsi ad esempio P_SCART. Poi, utilizzando la libreria “rnd.h” presente nel progetto effettuo la generazione casuale (pseudo-casuale) di un numero compreso fa 1 e 100. A questo punto vado a vedere se il numero generato è minore o uguale al valore di P_SCART. Se lo è vorrà dire che il pezzo è da scartare (e quindi andrò ad incrementare il contatore dei pezzi scartati), altrimenti no. Chiamando ad esempio ‘p’ il numero generato avrò la situazione: 1 <= p <= P_SCART  SCARTO IL PEZZO P_SCART < p <= 100 NON SCARTO Siccome i pezzi possono essere scartati dopo le lavorazioni di entrambe le macchine, suppongo che le probabilità di scarto siano diverse e quindi ho definito 2 costanti P_SCART1 e P_SCART2 e, a seconda della situazione in cui mi trovo (se a fine lavorazione1 o a fine lavorazione2), confronto il numero generato con il relativo valore della probabilità di scarto.
Tipo_Evento ARRIVO Coda1 += N Coda 1 == N Inserisci in FEL un evento PARTENZA dalla stazione 1  Inserisci in FEL l’evento del prossimo ARRIVO di N pezzi SI NO Flow-chart della gestione di un evento di tipo ARRIVO
Tipo_Evento PARTENZA-1 Scarto? Coda2 <= K Coda1 -- Coda2 ++ Serv1 = bloccato Coda1 -- PezziScart ++ Coda2 == 1? Coda1 > 0 ? Inserisci in FEL un evento PARTENZA2 Inserisci in FEL un evento PARTENZA1 NO NO NO NO SI SI SI SI Flow-chart della gestione di un evento di tipo Partenza dal servitore 1
Tipo_Evento PARTENZA-2 Coda2-- Scarto? Coda2 > 0 Serv1 bloccato? Coda1 > 0 Coda1 -- Coda2 ++ Inserisci in FEL un evento PARTENZA2 Inserisci in FEL un evento PARTENZA1 NO NO NO NO SI SI SI SI PezziScart ++ Serv1 = Non bloccato Flow-chart della gestione di un evento di tipo Partenza dal servitore 2
GESTIONE DELL’EVENTO DI “FINE SIMULAZIONE ” Tipo_Evento FINE SIMULAZIONE Rimuovo dalla FEL L’ evento di tipo ARRIVO EndOfSimulation = true In questo modo non arresto brutalmente la simulazione ma blocco gli arrivi e finisco di gestire i pezzi che sono presenti nel sistema. In questo modo può capitare che la simulazione non termini esattamente al tempo stabilito ma qualche istante dopo a causa della fine del trattamento di qualche pezzo. L’arresto del simulatore avverrà solo quando EndOfSimulation varrà true e la FEL sarà vuota. Quindi ho realizzato 2 nuove funzioni che lavorano sulla List, una per rimuovere gli eventi di tipo ARRIVO e un che restituisce true se la lista è vuota o false altrimenti. Quindi avrò, nel ciclo do-while principale del programma la seguente condizione: do Clock(); while (EndOfSimulation == false || Lista.Vuota() == false);
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
SECONDA PARTE REALIZZAZIONE DEL CODICE DEL SIMULATORE ,[object Object],[object Object],[object Object],[object Object],[object Object]
Realizzazione del simulatore:  cosa occorre definire ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
EventList: Strutture dati ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
event_list.h ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],EventList: Funzioni di gestione
EventList: Tipi e Parametri delle funzioni di gestione ,[object Object],[object Object],[object Object],[object Object],[object Object]
event_list.cc ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
event_list.cc  (2) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Inizializzazione del sistema e della EventList ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Nella slide successiva è riportato il codice della funzione Inizializza() del mio simulatore che esegue quanto appena descritto
Funzione di inizializzazione delle variabili del sistema ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Funzione per l’aggiornamento dei valori degli accumulatori necessari per la valutazione degli indici di prestazione ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Funzione per la gestione di un evento di tipo ARRIVO ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Funzione per la gestione di un evento di tipo PARTENZA DAL SERVITORE 1 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Funzione per la gestione di un evento di tipo PARTENZA DAL SERVITORE 2 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Funzione per la gestione di un evento di tipo FINE BATCH ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Funzione per la stampa a video dei risultati dell’esperimento di simulazione ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Funzione Clock() del simulatore La funzione clock() rappresenta il cuore del simulatore, e viene richiamata dal main del programma all’interno di un ciclo do-while fino a quando non si è raggiunta la fine della simulazione. Essa quando viene richiamata preleva il primo evento presente nella Future Event List tramite il metodo Get e aggiorna il valore della variabile CurrentTime, che rappresenta l’istante attuale della simulazione, impostandola al valore dell’istante di tempo associato all’evento appena estratto dalla FEL. A questo punto effettua un controllo su che tipo di evento è quello appena estratto e chiama di conseguenza l’opportuna funzione di gestione. Nel caso si tratti dell’evento di fine simulazione, SIM_END, viene chiamata la funzione che si occupa di togliere l’evento di tipo ARRIVO dalla FEL fermando cosi i futuri arrivi, e viene anche impostato a true il valore della variabile booleana EndOfSimulation che gestisce la fine della simulazione. Il codice della funzione Clock() è nella slide seguente
Funzione che gestisce il ciclo principale del simulatore ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Funzione Main del simulatore main(int argc, char* argv[]) { int j; long seed; if (argc != 2) usage(argv[0]); NRun = atoi(argv[1]); if (NRun == 0) { printf(&quot;ERRORE: Il parametro passato deve essere un intero.&quot;);  usage(argv[0]); } u1.open(&quot;utilizzazione1.txt&quot;); u2.open(&quot;utilizzazione2.txt&quot;); thr.open(&quot;throughput.txt&quot;); tdp.open(&quot;tempPerm.txt&quot;); for (j = 1; j <= NRun; j++) { cout << &quot;Inserisci il seme per la generazione dei numeri casuali: &quot;; cin >> seed; seme.set(seed); inizializza(); do Clock(); while (EndOfSimulation == false || Lista.Vuota() == false); Report(); } u1.close(); u2.close(); thr.close(); tdp.close(); cout << &quot;FINE SIMULAZIONE&quot; << flush; }
Funzionamento del simulatore ,[object Object],[object Object],[object Object],Screenshot di esempio
Funzionamento del simulatore ,[object Object],[object Object],[object Object]
Funzionamento del simulatore Se il programma viene lanciato correttamente, inizia la simulazione e vengono stampate a video le informazioni dei pezzi in arrivo e in partenza. Alla fine di ogni run vengono stampati a video, oltre che su files per la successiva analisi, i risultati ottenuti. Screenshot di esempio
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Esportazione dei risultati
Esportazione dei risultati su foglio di calcolo Excel Il simulatore scrive i risultati della simulazione su diversi file di testo, uno per ogni grandezza che si vuole prendere in considerazione e studiare. Negli screenshot qui di fianco è riportato il contenuto del file Throughput.txt che contiene tutti i valori calcolati dal simulatore per tale grandezza. In questo caso particolare  i valori si riferiscono alla simulazione a batch dove vengono eseguiti 10 Run da 15 batch ciascuno per un totale qundi di 150 valori che verrano poi esportati su un foglio di calcolo Excel.
Esportazione dei risultati su foglio di calcolo Excel ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Una volta   terminata la simulazione lanciando la mia applicazione SimAnalisi.exe ottengo la creazione di un foglio Excel per ogni grandezza con i valori automaticamente inseriti
[object Object],[object Object],[object Object],[object Object],Modulo Visual Basic.NET per l’esportazione dei risultati
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Modulo Visual Basic.NET per l’esportazione dei risultati
'Utilizzazione del servitore 2 wbookExcel = appExcel.Workbooks.Open(CurDir() + &quot;nalisi.xls&quot;) foglioExc = appExcel.Worksheets(&quot;Tabella2&quot;) objReader = New StreamReader(&quot;utilizzazione2.txt&quot;) For i = firstRow To lastRow For n = firstCol To lastCol foglioExc.Cells(i, n).Value = objReader.ReadLine().Replace(&quot;.&quot;, &quot;,&quot;) Next n Next i foglioExc.SaveAs(CurDir() + &quot;tilizzazione2.xls&quot;) 'Throughput del sistema senza scarti wbookExcel = appExcel.Workbooks.Open(CurDir() + &quot;nalisi.xls&quot;) foglioExc = appExcel.Worksheets(&quot;Tabella2&quot;) objReader = New StreamReader(&quot;throughput.txt&quot;) For i = firstRow To lastRow For n = firstCol To lastCol foglioExc.Cells(i, n).Value = objReader.ReadLine().Replace(&quot;.&quot;, &quot;,&quot;) Next n Next i foglioExc.SaveAs(CurDir() + &quot;hroughput.xls&quot;) 'Throughput del sistema senza scarti wbookExcel = appExcel.Workbooks.Open(CurDir() + &quot;nalisi.xls&quot;) foglioExc = appExcel.Worksheets(&quot;Tabella2&quot;) objReader = New StreamReader(&quot;tempPerm.txt&quot;) For i = firstRow To lastRow For n = firstCol To lastCol foglioExc.Cells(i, n).Value = objReader.ReadLine().Replace(&quot;.&quot;, &quot;,&quot;) Next n Next i foglioExc.SaveAs(CurDir() + &quot;empPerm.xls&quot;) appExcel.Quit() End Sub End Module
Analisi dell’output della simulazione ,[object Object],INTRODUZIONE TEORICA PARTE TERZA
[object Object],[object Object],[object Object],[object Object],[object Object],Analisi dell’output della simulazione Analisi in Transitorio VS Analisi a Regime
Dimensione del campione  e accuratezza del risultato Se si desidera ottenere un risultato con una certa accuratezza può essere necessario effettuare più esperimenti di simulazione: come stabilire quanti? Si inizia con un numero R 0  di repliche. Se l’accuratezza non è stata raggiunta si cerca di stimare quante ulteriori repliche sono necessarie per raggiungere l’accuratezza. Supponiamo di voler raggiungere una accuratezza di   , cioè  t α/2,R-1  S R             R conoscendo il valore S 0  per R = R 0  si può tentare una stima di quanti  run  aggiuntivi sono necessari: R    (t α/2,R-1  S 0 /   ) 2 poiché R compare sia a sinistra che a destra della disequazione (numero di gradi di libertà della t), operiamo una sostituzione di t α/2,R-1  con z α/2  (dato che t α/2,R-1     z α/2 ,  R   dovra’ essere    (z α/2  S 0 /   ) 2  ) Il valore iniziale di repliche (Run) che ho adottato è 15.
Un primo esempio di simulazione con campioni indipendenti ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Come ho proceduto ,[object Object],[object Object],Valore medio Ho calcolato per ogni risultato della simulazione la differenza rispetto al valor medio, riportata nella seconda colonna, e ne ho fatto il quadrato, riportato nella terza colonna. A questo punto ho fatto la somma dei quadrati delle differenze e l’ho divisa per il numero dei run eseguiti moltiplicato per tale numero -1. Quanto spiegato ora altro non è che l’applicazione della formula:
Come ho proceduto (2) ,[object Object],E ho calcolato un intervallo di confidenza al 95%  moltiplicando tale valore per il valore della distribuzione t di student  t α /2,n-1  e sommandolo e sottraendolo al valor medio calcolato in precedenza. Nell’esempio con confidenza al 95% e 15 run eseguite il valore è quello della colonna 0.975  ( α/2 = (100-95)/2 % = 2,5%)  14 gradi di libertà  . L’interpretazione è che il valore atteso si sta cercando di stimare è incluso nell’intervallo di confidenza con una probabilità del 100(1 – α)%.
Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch:  Throughput   0,182274226 0,181421774       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,000426226                 STUDENT 2,145                 VARIANZA 0,000198707           somma delle differenze   valor medio   3,94843E-08 8,29171E-06   0,181848               7,33326E-06 0,002708 0,17914     1,33225E-05 0,00365 0,178198     2,8224E-06 -0,00168 0,183528     2,23204E-06 -0,001494 0,183342     5,29E-10 2,3E-05 0,181825     2,17858E-06 -0,001476 0,183324     6,56384E-06 0,002562 0,179286     6,46176E-06 -0,002542 0,18439     5,53536E-07 0,000744 0,181104     1,28522E-05 0,003585 0,178263     9,72816E-06 0,003119 0,178729     2,503E-05 -0,005003 0,186851     1,87964E-06 -0,001371 0,183219     3,40772E-06 -0,001846 0,183694     9,58441E-07 -0,000979 0,182827     quadrato differenza valor medio - valore Risultato ottenuto
Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch:  utilizzazione servitore 1   0,954992065 0,950742335       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,002124865                 STUDENT 2,145                 VARIANZA 0,000990613           somma delle differenze   valor medio   9,81314E-07 0,000206076   0,9528672               0,000158261 0,0125802 0,940287     0,000841302 0,0290052 0,923862     4,27662E-08 -0,0002068 0,953074     3,20786E-05 -0,0056638 0,958531     2,33888E-05 0,0048362 0,948031     5,1984E-10 -2,28E-05 0,95289     0,000312377 0,0176742 0,935193     0,000970497 -0,0311528 0,98402     0,000184465 -0,0135818 0,966449     0,000586037 0,0242082 0,928659     3,62548E-05 0,0060212 0,946846     0,000501975 -0,0224048 0,975272     3,27047E-05 -0,0057188 0,958586     7,49748E-05 -0,0086588 0,961526     4,78145E-05 -0,0069148 0,959782     quadrato differenza valor medio - valore Risultato ottenuto
Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch:  utilizzazione servitore 2   0,678124507 0,674940693       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,001591907                 STUDENT 2,145                 VARIANZA 0,000742148           somma delle differenze   valor medio   5,50783E-07 0,000115664   0,6765326               3,35519E-05 -0,0057924 0,682325     5,00358E-05 0,0070736 0,669459     0,000241069 -0,0155264 0,692059     2,98737E-06 -0,0017284 0,678261     2,51462E-05 0,0050146 0,671518     4,55976E-05 0,0067526 0,66978     0,00016873 0,0129896 0,663543     8,33094E-05 -0,0091274 0,68566     6,37762E-07 0,0007986 0,675734     0,000161204 0,0126966 0,663836     0,000200806 0,0141706 0,662362     0,00028674 -0,0169334 0,693466     3,94058E-05 -0,0062774 0,68281     0,000173512 -0,0131724 0,689705     8,21126E-05 0,0090616 0,667471     quadrato differenza valor medio - valore Risultato ottenuto
Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Tempo di permanenza nel sistema   211,0541033 176,19443       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 17,42983665                 STUDENT 2,145                 VARIANZA 8,125797971           somma delle differenze   valor medio   66,02859267 13866,00446   193,6242667               4382,607708 66,20126667 127,423     8003,318234 89,46126667 104,163     411,0648117 -20,27473333 213,899     16,632259 4,078266667 189,546     2651,762489 51,49526667 142,129     1482,424538 38,50226667 155,122     4451,994315 66,72326667 126,901     30475,63922 -174,5727333 368,197     4,716425671 -2,171733333 195,796     6389,966602 79,93726667 113,687     4600,673759 67,82826667 125,796     46515,15925 -215,6737333 409,298     430,6980773 20,75326667 172,871     629,7724091 25,09526667 168,529     9483,396751 -97,38273333 291,007     quadrato differenza valor medio - valore Risultato ottenuto
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Migliorare l’accuratezza dell’utilizzazione del servitore 1
Migliorare l’accuratezza del tempo medio di permanenza nel sistema ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Considerazioni sull’accuratezza ,[object Object],[object Object],[object Object]
Risultati prima prova di simulazione ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
 
 
 
 
Grafici dell’andamento delle utilizzazioni del servitore 1 e del servitore 2
Modifica ai parametri di simulazione ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Simulazione con i nuovi valori delle distribuzioni ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Nuova simulazione con 5 Run ,[object Object],[object Object]
Tavola della distribuzione Student Siccome gli intervalli di confidenza che calcolo sono al 95% (α/2 = (100-95)/2 % = 2,5%) devo prendere il valore della student sulla colonna dello 0.975 e per quanto riguarda la riga dei gradi di libertà della distribuzione (df = degree of freedon) devo prendere il valore del numero di run – 1. Avendo eseguito 5 run devo prendere il valore della riga 4. Il valore ottenuto l’ho colorato e cerchiato nell’immagine sottostante: t α /2,n-1
Tabella dei risultati dell’esperimento di simulazione con 5 run indipendenti senza batch:  Throughput   0,188262 0,17969       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,004286                 STUDENT 2,776                 VARIANZA 0,001543986           somma delle differenze   valor medio   2,38389E-06 4,76778E-05   0,1839764                                   3,59568E-05 0,0059964 0,17798     5,29644E-06 0,0023014 0,181675     8,92269E-07 -0,0009446 0,184921     1,54418E-05 -0,0039296 0,187906     1,1721E-05 -0,0034236 0,1874     quadrato differenza valor medio - valore Risultato ottenuto
Tabella dei risultati dell’esperimento di simulazione con 5 run indipendenti senza batch: Utilizzazione Servitore1   0,85735 0,81027       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,02354                 STUDENT 2,776                 VARIANZA 0,008480292           somma delle differenze   valor medio   7,19154E-05 0,001438307   0,8338184                                   0,001321352 0,0363504 0,797468     7,877E-06 -0,0028066 0,836625     2,78425E-05 -0,0052766 0,839095     0,000304593 -0,0174526 0,851271     0,000116956 -0,0108146 0,844633     quadrato differenza valor medio - valore Risultato ottenuto
Tabella dei risultati dell’esperimento di simulazione con 5 run indipendenti senza batch: Utilizzazione Servitore2   0,65616 0,623329       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,016416                 STUDENT 2,776                 VARIANZA 0,00591352           somma delle differenze   valor medio   3,49697E-05 0,000699394   0,6397454                                   0,000328385 0,0181214 0,621624     0,000486838 0,0220644 0,617681     1,55047E-05 -0,0039376 0,643683     0,000288545 -0,0169866 0,656732     0,000371009 -0,0192616 0,659007     quadrato differenza valor medio - valore Risultato ottenuto
Tabella dei risultati dell’esperimento di simulazione con 5 run indipendenti senza batch: Tempo medio di permanenza   53,52156 40,728       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 6,39678                 STUDENT 2,776                 VARIANZA 2,30431936           somma delle differenze   valor medio   5,309887713 106,1977543   47,12478                                   89,31535246 9,45068 37,6741     2,735980646 1,65408 45,4707     6,810116544 -2,60962 49,7344     19,23980314 -4,38632 51,5111     16,88240179 -4,10882 51,2336     quadrato differenza valor medio - valore Risultato ottenuto
Nuova simulazione con 15 Run ,[object Object],[object Object],[object Object]
Tavola della distribuzione Student Avendo ampliando il numero di campioni su cui si basa l’esperimento da 5 a 15 occorre prendere in considerazione il nuovo valore della distribuzione T di Student. Ponendo sempre:  95% (α/2 = (100-95)/2 % = 2,5%) devo prendere sempre il valore della colonna 0.975 però questa volta il numero di gradi di libertà sarà 15 – 1 = 14. Nello screenshot sottostante ho evidenziato tale valore, utilizzato per eseguire i calcoli.
Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Throughput   0,18280146 0,18161654       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,00059246                 STUDENT 2,145                 VARIANZA 0,000276205           somma delle differenze   valor medio   7,62892E-08 1,60207E-05   0,182209               3,40402E-06 -0,001845 0,184054     6,48025E-07 0,000805 0,181404     2,79893E-06 -0,001673 0,183882     7,4529E-08 -0,000273 0,182482     5,79121E-07 -0,000761 0,18297     1,57252E-06 0,001254 0,180955     5,79121E-07 -0,000761 0,18297     1,57252E-06 0,001254 0,180955     5,79121E-07 -0,000761 0,18297     3,74911E-05 0,006123 0,176086     1,27916E-06 -0,001131 0,18334     1,57252E-06 0,001254 0,180955     1,27916E-06 -0,001131 0,18334     1,4352E-06 0,001198 0,181011     1,26167E-05 -0,003552 0,185761     quadrato differenza valor medio - valore Risultato ottenuto
Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Utilizzazione Servitore 1   0,827609427 0,823142707       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,00223336                 STUDENT 2,145                 VARIANZA 0,001041194           somma delle differenze   valor medio   1,08408E-06 0,000227658   0,825376067               1,96078E-05 0,004428067 0,820948     0,000156477 0,012509067 0,812867     2,31945E-05 0,004816067 0,82056     8,99071E-05 -0,009481933 0,834858     6,7403E-05 -0,008209933 0,833586     5,12751E-07 0,000716067 0,82466     6,7403E-05 -0,008209933 0,833586     5,12751E-07 0,000716067 0,82466     6,7403E-05 -0,008209933 0,833586     0,00174023 0,041716067 0,78366     9,26971E-05 -0,009627933 0,835004     5,12751E-07 0,000716067 0,82466     9,26971E-05 -0,009627933 0,835004     4,72657E-06 0,002174067 0,823202     0,00020805 -0,014423933 0,8398     quadrato differenza valor medio - valore Risultato ottenuto
Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Utilizzazione Servitore 2   0,636132284 0,63159025       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,002271017                 STUDENT 2,145                 VARIANZA 0,001058749           somma delle differenze   valor medio   1,12095E-06 0,000235399   0,633861267               5,78776E-05 -0,007607733 0,641469     0,000109783 -0,010477733 0,644339     3,93472E-05 -0,006272733 0,640134     3,77152E-05 0,006141267 0,627720     1,87763E-06 0,001370267 0,632491     4,58501E-05 0,006771267 0,627090     1,87763E-06 0,001370267 0,632491     4,43725E-05 0,006661267 0,627200     1,87763E-06 0,001370267 0,632491     0,000431653 0,020776267 0,613085     8,68324E-06 -0,002946733 0,636808     4,57147E-05 0,006761267 0,627100     8,68324E-06 -0,002946733 0,636808     5,84725E-05 -0,007646733 0,641508     0,000177522 -0,013323733 0,647185     quadrato differenza valor medio - valore Risultato ottenuto
Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Tempo medio di permanenza nel sistema   47,56398387 45,61865613       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,972663871                 STUDENT 2,145                 VARIANZA 0,45345635           somma delle differenze   valor medio   0,205622662 43,18075893   46,59132               27,88030083 -5,28018 51,8715     48,08202017 6,93412 39,6572     2,308515584 -1,51938 48,1107     71,60002842 -8,46168 55,0530     1,64999163 1,28452 45,3068     10,58057773 -3,25278 49,8441     1,64999163 1,28452 45,3068     10,58057773 -3,25278 49,8441     1,64999163 1,28452 45,3068     102,6314877 10,13072 36,4606     16,17986266 4,02242 42,5689     10,58057773 -3,25278 49,8441     16,17986266 4,02242 42,5689     0,001029126 -0,03208 46,6234     15,3004581 -3,91158 50,5029     quadrato differenza valor medio - valore Risultato ottenuto
Differenza di accuratezza tra i 2 esperimenti di simulazione a 5 e 15 run 0,004286 5 0,0005924 15 Accuratezza Numero di run Throughput 0,02354 5 0,00223336 15 Accuratezza Numero di run Utilizzazione Servitore 1 0,016416 5 0,002271017 15 Accuratezza Numero di run Utilizzazione Servitore 2 6,39678 5 0,972663871 15 Accuratezza Numero di run Tempo medio di permanenza
Differenza in termini di errore percentuale 2,36 % 5 0,33 % 15 Accuratezza Numero di run Throughput 2,85 % 5 0,27 % 15 Accuratezza Numero di run Utilizzazione Servitore 1 2,59 % 5 0,36 % 15 Accuratezza Numero di run Utilizzazione Servitore 2 13,73 % 5 2,08 % 15 Accuratezza Numero di run Tempo medio di permanenza
Il problema del transitorio iniziale ,[object Object],[object Object],[object Object],[object Object],[object Object]
Simulazione a batch ,[object Object],[object Object],[object Object],[object Object]
Simulazione a batch: osservazioni varie ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Simulazione a batch: come si è proceduto ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Simulazione a batch: i risultati ,[object Object],[object Object],[object Object],[object Object],[object Object]
Risultati della di simulazione a batch svolto con  10 run da 15 batch
Risultati della di simulazione a batch svolto con  10 run da 15 batch
Risultati della di simulazione a batch svolto con  10 run da 15 batch
Risultati della di simulazione a batch svolto con  10 run da 15 batch
 
 
Risultati della di simulazione a batch svolto con  15 run da 15 batch
Risultati della di simulazione a batch svolto con  15 run da 15 batch
Risultati della di simulazione a batch svolto con  15 run da 15 batch
Risultati della di simulazione a batch svolto con  15 run da 15 batch
Differenza di accuratezza tra i 2 esperimenti di simulazione a batch (15 batch) svolti con 10 e 15 run 0,0029 10 0,0019 15 Accuratezza Numero di run Throughput 0,0145 10 0,0098 15 Accuratezza Numero di run Utilizzazione Servitore 1 0,0108 10 0,008 15 Accuratezza Numero di run Utilizzazione Servitore 2 4,06 10 3,17 15 Accuratezza Numero di run Tempo medio di permanenza
Confronto dei risultati: Simulatore vs GreatSPN 0,18599 0,1856 0,18212 15 0,1865 0,1856 0,1806 10 Estremo sup. GreatSPN Estremo inf. Run Throughput 0,8428 0,83663 0,8231 15 0,84391 0,83663 0,81492 10 Estremo sup. GreatSPN Estremo inf. Run Utilizzazione servitore 1 0,6520 0,6445 0,63606 15 0,6503 0,6445 0,6287 10 Estremo sup. GreatSPN Estremo inf. Run Utilizzazione servitore 2 52,64 57,30 46,30 15 52,16 57,30 44,04 10 Estremo sup. GreatSPN Estremo inf. Run Tempo medio di permanenza
Realizzazione del sistema con reti di Petri e simulazione con il tool GreatSPN Screenshot dell’interfaccia di GreatSPN con la rete di Petri equivalente al sistema
Sistema a reti di Petri con GreatSPN ,[object Object]
Rete di Petri equivalente al sistema da simulare
Descrizione dei vari componenti della rete di Petri equivalente al sistema ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Descrizione dei vari componenti della rete di Petri equivalente al sistema (2)
GreatSPN: impostazione della distribuzione del tempo di interarrivo dei pezzi Per eseguire la simulazione sulla rete di Petri equivalente al sistema da studiare occorre ovviamente impostare i corretti valori delle distribuzioni per le transizioni. GreatSPN lavora con la distribuzione esponenziale, motivo per cui si è adottata questa scelta anche nell’implementazione del simulatore software. Lo screenshot mostra il valore per la transizione che gestisce gli arrivi che è impostata a 0,08 come nel codice del simulatore. Inoltre viene anche impostata come transizione a servitore singolo come previsto nel sistema reale.
GreatSPN: impostazione della distribuzione dei tempi di servizio dei 2 servitori Nel codice del simulatore, lo ricordo, i valori che avevo impostato erano: Exponential TempoServizio1(0.29,&seme); Exponential TempoServizio2(0.32,&seme); I 2 screenshot sottostanti mostrano come ho impostato gli stessi valori anche in GreatSPN.
GreatSPN:  impostazione delle probabilità di scarto dei pezzi da parte delle 2 postazioni Nei 2 screenshot sottostanti si vede come ho impostato le percentuali di scarto delle 2 postazioni. Lo scarto viene rappresentato nella rete di Petri come una transazione immediata, che quindi richiede tempo 0. (indicate dal rettangolo nero pieno, a differenza delle precedenti che erano temporizzate rappresentate quindi dal rettangolo bianco “vuoto”). Con la seguente definizione indico la probabilità che ha un token di finire in ramo della rete (uscire, quindi tornare nel posto “popolazione”) piuttosto che in un altro (proseguire alla stazione 2 nel caso di uscita dalla stazione 1). Le relative transazioni di “NonScarto1” e “NonScarto2” avranno probabilità data da 1 meno i valori indicati qui sotto. Probabilità scarto1 = 15% Probabilità scarto2 = 10%
GreatSPN:  i risultati Per quanto riguarda i risultati ricavati con greatSPN, alcuni, come il Throughpu, sono visualizzati direttamente nella rete dopo il calcolo della Steady-StateSolution. Questo perché esso si riverisce ad una transazione. Altri, quelli riguardanti i posti, come le Utilizzazioni dei servitori sono mostrati tramite il comando “Show” in apposite finestre.
GreatSPN:  i risultati Utilizzazione 2: 0,64459 Utilizzazione 1: 83663 Per vedere i risultati delle Utilizzazioni dei 2 servitori, che sono tra quelle che interessano e che si devono studiare occore utilizzare il comando “Show” results e poi cliccare sui rispettivi posti. Vengono cosi aperte le rispettive finestre con i risultati. I 2 screenshot sottostanti mostrano i valori delle Utilizzazioni dei 2 servitori risultanti dalla simulazione con GreatSPN.
GreatSPN:  calcolo del tempo medio di permanenza Per quanto riguarda il calcolo del tempo medio di permanenza il discorso è diverso, in quanto tale grandezza non si ha a disposizione direttamente ma occorre ricavarla in modo indiretto tramite una formula, partendo sempre da alcuni valori ricavati tramite GreatSPN. Quelli che ho cerchiato in blu nell’immagine ad esempio servono per il calcolo del numero medio di pezzi nel sistema.
GreatSPN:  calcolo del tempo medio di permanenza ,[object Object],[object Object],N X is1 W = Dove con X is1  si intende il throughput in ingresso alla postazione 1 che calcolo nel modo seguente: Xis1 = N * X arrivi N = numero di pezzi in arrivo Xis1 = 3 * 0,08 = 0,24 Come verifica provo che il valore di Xis1 deve essere uguale alla somma: Xis1 = X scarto1  + X scarto2  + X NonScarto2   Xis1 = 0,0363 + 0,020 + 0,185 = 0,241
GreatSPN:  calcolo del tempo medio di permanenza ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
GreatSPN:  calcolo del tempo medio di permanenza ,[object Object],[object Object],[object Object],N X is1 W = 13,75 0,24 W =  = 57,3 A questo punto, dopo aver calcolato il Xis1 e il numero medio di pezzi presenti nel sistema, applico la  LEGGE DEL TEMPO DI ATTESA  definita così: n = w * X Da cui ricavo 13,75 0,24 W =  = 57,3
Conclusioni ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Confronto dei risultati: Simulatore vs GreatSPN 0,18599 0,1856 0,18212 15 0,1865 0,1856 0,1806 10 Estremo sup. GreatSPN Estremo inf. Run Throughput 0,8428 0,83663 0,8231 15 0,84391 0,83663 0,81492 10 Estremo sup. GreatSPN Estremo inf. Run Utilizzazione servitore 1 0,6520 0,6445 0,63606 15 0,6503 0,6445 0,6287 10 Estremo sup. GreatSPN Estremo inf. Run Utilizzazione servitore 2 52,64 57,30 46,30 15 52,16 57,30 44,04 10 Estremo sup. GreatSPN Estremo inf. Run Tempo medio di permanenza

More Related Content

Simulazione ad Eventi Discreti (C++) e tramite Rete di Petri di un sistema.

  • 1. Magazzino pezzi da lavorare LABORATORIO DI SIMULAZIONE Molinari Davis Esercizio per la parte pratica dell’esame Sistema da simulare
  • 2. PRIMA PARTE “ Nella prima fase si dovr à analizzare il sistema e si dovranno definire (sulla carta) le variabili di stato, gli eventi - distinguendo quelli incondizionati, che dovranno essere memorizzati nella FEL da quelli condizionati, trattati in seguito al verificarsi di un cambiamento di stato causato da un evento incondizionato, le procedure per il trattamento degli eventi, gli accumulatori per il calcolo degli indici di prestazione. “
  • 3.
  • 4.
  • 5.
  • 6. GESTIONE DELL’EVENTO DI SCARTO DI UN PEZZO (EVENTO CONDIZIONATO) Per vedere se un pezzo è da scartare o meno faccio così: Definisco, con una #define, all’inizio del programma una costante simbolica che indica quale è la probabilità che il pezzo venga scartato e che potrà chiamarsi ad esempio P_SCART. Poi, utilizzando la libreria “rnd.h” presente nel progetto effettuo la generazione casuale (pseudo-casuale) di un numero compreso fa 1 e 100. A questo punto vado a vedere se il numero generato è minore o uguale al valore di P_SCART. Se lo è vorrà dire che il pezzo è da scartare (e quindi andrò ad incrementare il contatore dei pezzi scartati), altrimenti no. Chiamando ad esempio ‘p’ il numero generato avrò la situazione: 1 <= p <= P_SCART SCARTO IL PEZZO P_SCART < p <= 100 NON SCARTO Siccome i pezzi possono essere scartati dopo le lavorazioni di entrambe le macchine, suppongo che le probabilità di scarto siano diverse e quindi ho definito 2 costanti P_SCART1 e P_SCART2 e, a seconda della situazione in cui mi trovo (se a fine lavorazione1 o a fine lavorazione2), confronto il numero generato con il relativo valore della probabilità di scarto.
  • 7. Tipo_Evento ARRIVO Coda1 += N Coda 1 == N Inserisci in FEL un evento PARTENZA dalla stazione 1 Inserisci in FEL l’evento del prossimo ARRIVO di N pezzi SI NO Flow-chart della gestione di un evento di tipo ARRIVO
  • 8. Tipo_Evento PARTENZA-1 Scarto? Coda2 <= K Coda1 -- Coda2 ++ Serv1 = bloccato Coda1 -- PezziScart ++ Coda2 == 1? Coda1 > 0 ? Inserisci in FEL un evento PARTENZA2 Inserisci in FEL un evento PARTENZA1 NO NO NO NO SI SI SI SI Flow-chart della gestione di un evento di tipo Partenza dal servitore 1
  • 9. Tipo_Evento PARTENZA-2 Coda2-- Scarto? Coda2 > 0 Serv1 bloccato? Coda1 > 0 Coda1 -- Coda2 ++ Inserisci in FEL un evento PARTENZA2 Inserisci in FEL un evento PARTENZA1 NO NO NO NO SI SI SI SI PezziScart ++ Serv1 = Non bloccato Flow-chart della gestione di un evento di tipo Partenza dal servitore 2
  • 10. GESTIONE DELL’EVENTO DI “FINE SIMULAZIONE ” Tipo_Evento FINE SIMULAZIONE Rimuovo dalla FEL L’ evento di tipo ARRIVO EndOfSimulation = true In questo modo non arresto brutalmente la simulazione ma blocco gli arrivi e finisco di gestire i pezzi che sono presenti nel sistema. In questo modo può capitare che la simulazione non termini esattamente al tempo stabilito ma qualche istante dopo a causa della fine del trattamento di qualche pezzo. L’arresto del simulatore avverrà solo quando EndOfSimulation varrà true e la FEL sarà vuota. Quindi ho realizzato 2 nuove funzioni che lavorano sulla List, una per rimuovere gli eventi di tipo ARRIVO e un che restituisce true se la lista è vuota o false altrimenti. Quindi avrò, nel ciclo do-while principale del programma la seguente condizione: do Clock(); while (EndOfSimulation == false || Lista.Vuota() == false);
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29. Funzione Clock() del simulatore La funzione clock() rappresenta il cuore del simulatore, e viene richiamata dal main del programma all’interno di un ciclo do-while fino a quando non si è raggiunta la fine della simulazione. Essa quando viene richiamata preleva il primo evento presente nella Future Event List tramite il metodo Get e aggiorna il valore della variabile CurrentTime, che rappresenta l’istante attuale della simulazione, impostandola al valore dell’istante di tempo associato all’evento appena estratto dalla FEL. A questo punto effettua un controllo su che tipo di evento è quello appena estratto e chiama di conseguenza l’opportuna funzione di gestione. Nel caso si tratti dell’evento di fine simulazione, SIM_END, viene chiamata la funzione che si occupa di togliere l’evento di tipo ARRIVO dalla FEL fermando cosi i futuri arrivi, e viene anche impostato a true il valore della variabile booleana EndOfSimulation che gestisce la fine della simulazione. Il codice della funzione Clock() è nella slide seguente
  • 30.
  • 31. Funzione Main del simulatore main(int argc, char* argv[]) { int j; long seed; if (argc != 2) usage(argv[0]); NRun = atoi(argv[1]); if (NRun == 0) { printf(&quot;ERRORE: Il parametro passato deve essere un intero.&quot;); usage(argv[0]); } u1.open(&quot;utilizzazione1.txt&quot;); u2.open(&quot;utilizzazione2.txt&quot;); thr.open(&quot;throughput.txt&quot;); tdp.open(&quot;tempPerm.txt&quot;); for (j = 1; j <= NRun; j++) { cout << &quot;Inserisci il seme per la generazione dei numeri casuali: &quot;; cin >> seed; seme.set(seed); inizializza(); do Clock(); while (EndOfSimulation == false || Lista.Vuota() == false); Report(); } u1.close(); u2.close(); thr.close(); tdp.close(); cout << &quot;FINE SIMULAZIONE&quot; << flush; }
  • 32.
  • 33.
  • 34. Funzionamento del simulatore Se il programma viene lanciato correttamente, inizia la simulazione e vengono stampate a video le informazioni dei pezzi in arrivo e in partenza. Alla fine di ogni run vengono stampati a video, oltre che su files per la successiva analisi, i risultati ottenuti. Screenshot di esempio
  • 35.
  • 36. Esportazione dei risultati su foglio di calcolo Excel Il simulatore scrive i risultati della simulazione su diversi file di testo, uno per ogni grandezza che si vuole prendere in considerazione e studiare. Negli screenshot qui di fianco è riportato il contenuto del file Throughput.txt che contiene tutti i valori calcolati dal simulatore per tale grandezza. In questo caso particolare i valori si riferiscono alla simulazione a batch dove vengono eseguiti 10 Run da 15 batch ciascuno per un totale qundi di 150 valori che verrano poi esportati su un foglio di calcolo Excel.
  • 37.
  • 38.
  • 39.
  • 40. 'Utilizzazione del servitore 2 wbookExcel = appExcel.Workbooks.Open(CurDir() + &quot;nalisi.xls&quot;) foglioExc = appExcel.Worksheets(&quot;Tabella2&quot;) objReader = New StreamReader(&quot;utilizzazione2.txt&quot;) For i = firstRow To lastRow For n = firstCol To lastCol foglioExc.Cells(i, n).Value = objReader.ReadLine().Replace(&quot;.&quot;, &quot;,&quot;) Next n Next i foglioExc.SaveAs(CurDir() + &quot;tilizzazione2.xls&quot;) 'Throughput del sistema senza scarti wbookExcel = appExcel.Workbooks.Open(CurDir() + &quot;nalisi.xls&quot;) foglioExc = appExcel.Worksheets(&quot;Tabella2&quot;) objReader = New StreamReader(&quot;throughput.txt&quot;) For i = firstRow To lastRow For n = firstCol To lastCol foglioExc.Cells(i, n).Value = objReader.ReadLine().Replace(&quot;.&quot;, &quot;,&quot;) Next n Next i foglioExc.SaveAs(CurDir() + &quot;hroughput.xls&quot;) 'Throughput del sistema senza scarti wbookExcel = appExcel.Workbooks.Open(CurDir() + &quot;nalisi.xls&quot;) foglioExc = appExcel.Worksheets(&quot;Tabella2&quot;) objReader = New StreamReader(&quot;tempPerm.txt&quot;) For i = firstRow To lastRow For n = firstCol To lastCol foglioExc.Cells(i, n).Value = objReader.ReadLine().Replace(&quot;.&quot;, &quot;,&quot;) Next n Next i foglioExc.SaveAs(CurDir() + &quot;empPerm.xls&quot;) appExcel.Quit() End Sub End Module
  • 41.
  • 42.
  • 43. Dimensione del campione e accuratezza del risultato Se si desidera ottenere un risultato con una certa accuratezza può essere necessario effettuare più esperimenti di simulazione: come stabilire quanti? Si inizia con un numero R 0 di repliche. Se l’accuratezza non è stata raggiunta si cerca di stimare quante ulteriori repliche sono necessarie per raggiungere l’accuratezza. Supponiamo di voler raggiungere una accuratezza di  , cioè t α/2,R-1 S R     R conoscendo il valore S 0 per R = R 0 si può tentare una stima di quanti run aggiuntivi sono necessari: R  (t α/2,R-1 S 0 /  ) 2 poiché R compare sia a sinistra che a destra della disequazione (numero di gradi di libertà della t), operiamo una sostituzione di t α/2,R-1 con z α/2 (dato che t α/2,R-1  z α/2 , R  dovra’ essere  (z α/2 S 0 /  ) 2 ) Il valore iniziale di repliche (Run) che ho adottato è 15.
  • 44.
  • 45.
  • 46.
  • 47. Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Throughput   0,182274226 0,181421774       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,000426226                 STUDENT 2,145                 VARIANZA 0,000198707           somma delle differenze   valor medio   3,94843E-08 8,29171E-06   0,181848               7,33326E-06 0,002708 0,17914     1,33225E-05 0,00365 0,178198     2,8224E-06 -0,00168 0,183528     2,23204E-06 -0,001494 0,183342     5,29E-10 2,3E-05 0,181825     2,17858E-06 -0,001476 0,183324     6,56384E-06 0,002562 0,179286     6,46176E-06 -0,002542 0,18439     5,53536E-07 0,000744 0,181104     1,28522E-05 0,003585 0,178263     9,72816E-06 0,003119 0,178729     2,503E-05 -0,005003 0,186851     1,87964E-06 -0,001371 0,183219     3,40772E-06 -0,001846 0,183694     9,58441E-07 -0,000979 0,182827     quadrato differenza valor medio - valore Risultato ottenuto
  • 48. Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: utilizzazione servitore 1   0,954992065 0,950742335       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,002124865                 STUDENT 2,145                 VARIANZA 0,000990613           somma delle differenze   valor medio   9,81314E-07 0,000206076   0,9528672               0,000158261 0,0125802 0,940287     0,000841302 0,0290052 0,923862     4,27662E-08 -0,0002068 0,953074     3,20786E-05 -0,0056638 0,958531     2,33888E-05 0,0048362 0,948031     5,1984E-10 -2,28E-05 0,95289     0,000312377 0,0176742 0,935193     0,000970497 -0,0311528 0,98402     0,000184465 -0,0135818 0,966449     0,000586037 0,0242082 0,928659     3,62548E-05 0,0060212 0,946846     0,000501975 -0,0224048 0,975272     3,27047E-05 -0,0057188 0,958586     7,49748E-05 -0,0086588 0,961526     4,78145E-05 -0,0069148 0,959782     quadrato differenza valor medio - valore Risultato ottenuto
  • 49. Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: utilizzazione servitore 2   0,678124507 0,674940693       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,001591907                 STUDENT 2,145                 VARIANZA 0,000742148           somma delle differenze   valor medio   5,50783E-07 0,000115664   0,6765326               3,35519E-05 -0,0057924 0,682325     5,00358E-05 0,0070736 0,669459     0,000241069 -0,0155264 0,692059     2,98737E-06 -0,0017284 0,678261     2,51462E-05 0,0050146 0,671518     4,55976E-05 0,0067526 0,66978     0,00016873 0,0129896 0,663543     8,33094E-05 -0,0091274 0,68566     6,37762E-07 0,0007986 0,675734     0,000161204 0,0126966 0,663836     0,000200806 0,0141706 0,662362     0,00028674 -0,0169334 0,693466     3,94058E-05 -0,0062774 0,68281     0,000173512 -0,0131724 0,689705     8,21126E-05 0,0090616 0,667471     quadrato differenza valor medio - valore Risultato ottenuto
  • 50. Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Tempo di permanenza nel sistema   211,0541033 176,19443       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 17,42983665                 STUDENT 2,145                 VARIANZA 8,125797971           somma delle differenze   valor medio   66,02859267 13866,00446   193,6242667               4382,607708 66,20126667 127,423     8003,318234 89,46126667 104,163     411,0648117 -20,27473333 213,899     16,632259 4,078266667 189,546     2651,762489 51,49526667 142,129     1482,424538 38,50226667 155,122     4451,994315 66,72326667 126,901     30475,63922 -174,5727333 368,197     4,716425671 -2,171733333 195,796     6389,966602 79,93726667 113,687     4600,673759 67,82826667 125,796     46515,15925 -215,6737333 409,298     430,6980773 20,75326667 172,871     629,7724091 25,09526667 168,529     9483,396751 -97,38273333 291,007     quadrato differenza valor medio - valore Risultato ottenuto
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.  
  • 56.  
  • 57.  
  • 58.  
  • 59. Grafici dell’andamento delle utilizzazioni del servitore 1 e del servitore 2
  • 60.
  • 61.
  • 62.
  • 63. Tavola della distribuzione Student Siccome gli intervalli di confidenza che calcolo sono al 95% (α/2 = (100-95)/2 % = 2,5%) devo prendere il valore della student sulla colonna dello 0.975 e per quanto riguarda la riga dei gradi di libertà della distribuzione (df = degree of freedon) devo prendere il valore del numero di run – 1. Avendo eseguito 5 run devo prendere il valore della riga 4. Il valore ottenuto l’ho colorato e cerchiato nell’immagine sottostante: t α /2,n-1
  • 64. Tabella dei risultati dell’esperimento di simulazione con 5 run indipendenti senza batch: Throughput   0,188262 0,17969       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,004286                 STUDENT 2,776                 VARIANZA 0,001543986           somma delle differenze   valor medio   2,38389E-06 4,76778E-05   0,1839764                                   3,59568E-05 0,0059964 0,17798     5,29644E-06 0,0023014 0,181675     8,92269E-07 -0,0009446 0,184921     1,54418E-05 -0,0039296 0,187906     1,1721E-05 -0,0034236 0,1874     quadrato differenza valor medio - valore Risultato ottenuto
  • 65. Tabella dei risultati dell’esperimento di simulazione con 5 run indipendenti senza batch: Utilizzazione Servitore1   0,85735 0,81027       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,02354                 STUDENT 2,776                 VARIANZA 0,008480292           somma delle differenze   valor medio   7,19154E-05 0,001438307   0,8338184                                   0,001321352 0,0363504 0,797468     7,877E-06 -0,0028066 0,836625     2,78425E-05 -0,0052766 0,839095     0,000304593 -0,0174526 0,851271     0,000116956 -0,0108146 0,844633     quadrato differenza valor medio - valore Risultato ottenuto
  • 66. Tabella dei risultati dell’esperimento di simulazione con 5 run indipendenti senza batch: Utilizzazione Servitore2   0,65616 0,623329       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,016416                 STUDENT 2,776                 VARIANZA 0,00591352           somma delle differenze   valor medio   3,49697E-05 0,000699394   0,6397454                                   0,000328385 0,0181214 0,621624     0,000486838 0,0220644 0,617681     1,55047E-05 -0,0039376 0,643683     0,000288545 -0,0169866 0,656732     0,000371009 -0,0192616 0,659007     quadrato differenza valor medio - valore Risultato ottenuto
  • 67. Tabella dei risultati dell’esperimento di simulazione con 5 run indipendenti senza batch: Tempo medio di permanenza   53,52156 40,728       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 6,39678                 STUDENT 2,776                 VARIANZA 2,30431936           somma delle differenze   valor medio   5,309887713 106,1977543   47,12478                                   89,31535246 9,45068 37,6741     2,735980646 1,65408 45,4707     6,810116544 -2,60962 49,7344     19,23980314 -4,38632 51,5111     16,88240179 -4,10882 51,2336     quadrato differenza valor medio - valore Risultato ottenuto
  • 68.
  • 69. Tavola della distribuzione Student Avendo ampliando il numero di campioni su cui si basa l’esperimento da 5 a 15 occorre prendere in considerazione il nuovo valore della distribuzione T di Student. Ponendo sempre: 95% (α/2 = (100-95)/2 % = 2,5%) devo prendere sempre il valore della colonna 0.975 però questa volta il numero di gradi di libertà sarà 15 – 1 = 14. Nello screenshot sottostante ho evidenziato tale valore, utilizzato per eseguire i calcoli.
  • 70. Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Throughput   0,18280146 0,18161654       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,00059246                 STUDENT 2,145                 VARIANZA 0,000276205           somma delle differenze   valor medio   7,62892E-08 1,60207E-05   0,182209               3,40402E-06 -0,001845 0,184054     6,48025E-07 0,000805 0,181404     2,79893E-06 -0,001673 0,183882     7,4529E-08 -0,000273 0,182482     5,79121E-07 -0,000761 0,18297     1,57252E-06 0,001254 0,180955     5,79121E-07 -0,000761 0,18297     1,57252E-06 0,001254 0,180955     5,79121E-07 -0,000761 0,18297     3,74911E-05 0,006123 0,176086     1,27916E-06 -0,001131 0,18334     1,57252E-06 0,001254 0,180955     1,27916E-06 -0,001131 0,18334     1,4352E-06 0,001198 0,181011     1,26167E-05 -0,003552 0,185761     quadrato differenza valor medio - valore Risultato ottenuto
  • 71. Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Utilizzazione Servitore 1   0,827609427 0,823142707       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,00223336                 STUDENT 2,145                 VARIANZA 0,001041194           somma delle differenze   valor medio   1,08408E-06 0,000227658   0,825376067               1,96078E-05 0,004428067 0,820948     0,000156477 0,012509067 0,812867     2,31945E-05 0,004816067 0,82056     8,99071E-05 -0,009481933 0,834858     6,7403E-05 -0,008209933 0,833586     5,12751E-07 0,000716067 0,82466     6,7403E-05 -0,008209933 0,833586     5,12751E-07 0,000716067 0,82466     6,7403E-05 -0,008209933 0,833586     0,00174023 0,041716067 0,78366     9,26971E-05 -0,009627933 0,835004     5,12751E-07 0,000716067 0,82466     9,26971E-05 -0,009627933 0,835004     4,72657E-06 0,002174067 0,823202     0,00020805 -0,014423933 0,8398     quadrato differenza valor medio - valore Risultato ottenuto
  • 72. Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Utilizzazione Servitore 2   0,636132284 0,63159025       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,002271017                 STUDENT 2,145                 VARIANZA 0,001058749           somma delle differenze   valor medio   1,12095E-06 0,000235399   0,633861267               5,78776E-05 -0,007607733 0,641469     0,000109783 -0,010477733 0,644339     3,93472E-05 -0,006272733 0,640134     3,77152E-05 0,006141267 0,627720     1,87763E-06 0,001370267 0,632491     4,58501E-05 0,006771267 0,627090     1,87763E-06 0,001370267 0,632491     4,43725E-05 0,006661267 0,627200     1,87763E-06 0,001370267 0,632491     0,000431653 0,020776267 0,613085     8,68324E-06 -0,002946733 0,636808     4,57147E-05 0,006761267 0,627100     8,68324E-06 -0,002946733 0,636808     5,84725E-05 -0,007646733 0,641508     0,000177522 -0,013323733 0,647185     quadrato differenza valor medio - valore Risultato ottenuto
  • 73. Tabella dei risultati dell’esperimento di simulazione con 15 run indipendenti senza batch: Tempo medio di permanenza nel sistema   47,56398387 45,61865613       INTERVALLO DI CONFIDENZA                         ACCURATEZZA 0,972663871                 STUDENT 2,145                 VARIANZA 0,45345635           somma delle differenze   valor medio   0,205622662 43,18075893   46,59132               27,88030083 -5,28018 51,8715     48,08202017 6,93412 39,6572     2,308515584 -1,51938 48,1107     71,60002842 -8,46168 55,0530     1,64999163 1,28452 45,3068     10,58057773 -3,25278 49,8441     1,64999163 1,28452 45,3068     10,58057773 -3,25278 49,8441     1,64999163 1,28452 45,3068     102,6314877 10,13072 36,4606     16,17986266 4,02242 42,5689     10,58057773 -3,25278 49,8441     16,17986266 4,02242 42,5689     0,001029126 -0,03208 46,6234     15,3004581 -3,91158 50,5029     quadrato differenza valor medio - valore Risultato ottenuto
  • 74. Differenza di accuratezza tra i 2 esperimenti di simulazione a 5 e 15 run 0,004286 5 0,0005924 15 Accuratezza Numero di run Throughput 0,02354 5 0,00223336 15 Accuratezza Numero di run Utilizzazione Servitore 1 0,016416 5 0,002271017 15 Accuratezza Numero di run Utilizzazione Servitore 2 6,39678 5 0,972663871 15 Accuratezza Numero di run Tempo medio di permanenza
  • 75. Differenza in termini di errore percentuale 2,36 % 5 0,33 % 15 Accuratezza Numero di run Throughput 2,85 % 5 0,27 % 15 Accuratezza Numero di run Utilizzazione Servitore 1 2,59 % 5 0,36 % 15 Accuratezza Numero di run Utilizzazione Servitore 2 13,73 % 5 2,08 % 15 Accuratezza Numero di run Tempo medio di permanenza
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81. Risultati della di simulazione a batch svolto con 10 run da 15 batch
  • 82. Risultati della di simulazione a batch svolto con 10 run da 15 batch
  • 83. Risultati della di simulazione a batch svolto con 10 run da 15 batch
  • 84. Risultati della di simulazione a batch svolto con 10 run da 15 batch
  • 85.  
  • 86.  
  • 87. Risultati della di simulazione a batch svolto con 15 run da 15 batch
  • 88. Risultati della di simulazione a batch svolto con 15 run da 15 batch
  • 89. Risultati della di simulazione a batch svolto con 15 run da 15 batch
  • 90. Risultati della di simulazione a batch svolto con 15 run da 15 batch
  • 91. Differenza di accuratezza tra i 2 esperimenti di simulazione a batch (15 batch) svolti con 10 e 15 run 0,0029 10 0,0019 15 Accuratezza Numero di run Throughput 0,0145 10 0,0098 15 Accuratezza Numero di run Utilizzazione Servitore 1 0,0108 10 0,008 15 Accuratezza Numero di run Utilizzazione Servitore 2 4,06 10 3,17 15 Accuratezza Numero di run Tempo medio di permanenza
  • 92. Confronto dei risultati: Simulatore vs GreatSPN 0,18599 0,1856 0,18212 15 0,1865 0,1856 0,1806 10 Estremo sup. GreatSPN Estremo inf. Run Throughput 0,8428 0,83663 0,8231 15 0,84391 0,83663 0,81492 10 Estremo sup. GreatSPN Estremo inf. Run Utilizzazione servitore 1 0,6520 0,6445 0,63606 15 0,6503 0,6445 0,6287 10 Estremo sup. GreatSPN Estremo inf. Run Utilizzazione servitore 2 52,64 57,30 46,30 15 52,16 57,30 44,04 10 Estremo sup. GreatSPN Estremo inf. Run Tempo medio di permanenza
  • 93. Realizzazione del sistema con reti di Petri e simulazione con il tool GreatSPN Screenshot dell’interfaccia di GreatSPN con la rete di Petri equivalente al sistema
  • 94.
  • 95. Rete di Petri equivalente al sistema da simulare
  • 96.
  • 97.
  • 98. GreatSPN: impostazione della distribuzione del tempo di interarrivo dei pezzi Per eseguire la simulazione sulla rete di Petri equivalente al sistema da studiare occorre ovviamente impostare i corretti valori delle distribuzioni per le transizioni. GreatSPN lavora con la distribuzione esponenziale, motivo per cui si è adottata questa scelta anche nell’implementazione del simulatore software. Lo screenshot mostra il valore per la transizione che gestisce gli arrivi che è impostata a 0,08 come nel codice del simulatore. Inoltre viene anche impostata come transizione a servitore singolo come previsto nel sistema reale.
  • 99. GreatSPN: impostazione della distribuzione dei tempi di servizio dei 2 servitori Nel codice del simulatore, lo ricordo, i valori che avevo impostato erano: Exponential TempoServizio1(0.29,&seme); Exponential TempoServizio2(0.32,&seme); I 2 screenshot sottostanti mostrano come ho impostato gli stessi valori anche in GreatSPN.
  • 100. GreatSPN: impostazione delle probabilità di scarto dei pezzi da parte delle 2 postazioni Nei 2 screenshot sottostanti si vede come ho impostato le percentuali di scarto delle 2 postazioni. Lo scarto viene rappresentato nella rete di Petri come una transazione immediata, che quindi richiede tempo 0. (indicate dal rettangolo nero pieno, a differenza delle precedenti che erano temporizzate rappresentate quindi dal rettangolo bianco “vuoto”). Con la seguente definizione indico la probabilità che ha un token di finire in ramo della rete (uscire, quindi tornare nel posto “popolazione”) piuttosto che in un altro (proseguire alla stazione 2 nel caso di uscita dalla stazione 1). Le relative transazioni di “NonScarto1” e “NonScarto2” avranno probabilità data da 1 meno i valori indicati qui sotto. Probabilità scarto1 = 15% Probabilità scarto2 = 10%
  • 101. GreatSPN: i risultati Per quanto riguarda i risultati ricavati con greatSPN, alcuni, come il Throughpu, sono visualizzati direttamente nella rete dopo il calcolo della Steady-StateSolution. Questo perché esso si riverisce ad una transazione. Altri, quelli riguardanti i posti, come le Utilizzazioni dei servitori sono mostrati tramite il comando “Show” in apposite finestre.
  • 102. GreatSPN: i risultati Utilizzazione 2: 0,64459 Utilizzazione 1: 83663 Per vedere i risultati delle Utilizzazioni dei 2 servitori, che sono tra quelle che interessano e che si devono studiare occore utilizzare il comando “Show” results e poi cliccare sui rispettivi posti. Vengono cosi aperte le rispettive finestre con i risultati. I 2 screenshot sottostanti mostrano i valori delle Utilizzazioni dei 2 servitori risultanti dalla simulazione con GreatSPN.
  • 103. GreatSPN: calcolo del tempo medio di permanenza Per quanto riguarda il calcolo del tempo medio di permanenza il discorso è diverso, in quanto tale grandezza non si ha a disposizione direttamente ma occorre ricavarla in modo indiretto tramite una formula, partendo sempre da alcuni valori ricavati tramite GreatSPN. Quelli che ho cerchiato in blu nell’immagine ad esempio servono per il calcolo del numero medio di pezzi nel sistema.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108. Confronto dei risultati: Simulatore vs GreatSPN 0,18599 0,1856 0,18212 15 0,1865 0,1856 0,1806 10 Estremo sup. GreatSPN Estremo inf. Run Throughput 0,8428 0,83663 0,8231 15 0,84391 0,83663 0,81492 10 Estremo sup. GreatSPN Estremo inf. Run Utilizzazione servitore 1 0,6520 0,6445 0,63606 15 0,6503 0,6445 0,6287 10 Estremo sup. GreatSPN Estremo inf. Run Utilizzazione servitore 2 52,64 57,30 46,30 15 52,16 57,30 44,04 10 Estremo sup. GreatSPN Estremo inf. Run Tempo medio di permanenza