Tesina
Transcript
Tesina
Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco INDICE GENERALE DESCRIZIONE DEL SISTEMA REALE E DEFINIZIONE DEGLI OBIETTIVI DELLO STUDIO ..............................................................................................................................................................2 Descrizione qualitativa e funzionale del sistema reale....................................................................2 Obiettivi dello studio di simulazione...............................................................................................3 ASSUNZIONI E MODELLO..............................................................................................................3 Assunzioni.......................................................................................................................................3 Descrizione qualitativa e funzionale del modello............................................................................4 PARAMETRI DI INPUT NEL MODELLO........................................................................................6 CARATTERIZZAZIONE DEI PARMETRI DI INPUT DEL MODELLO........................................6 WORKLOAD ANALISYS..................................................................................................................6 MODELLI SEMPLIFICATI................................................................................................................8 STESURA DEL CODICE....................................................................................................................9 Strutture dati usate nella simulazione del magazzino a coda multipla............................................9 Strutture dati usate nella simulazione del magazzino a coda unica...............................................34 PROGETTO DEGLI ESPERIMENTI...............................................................................................39 Modelli alternativi.........................................................................................................................39 Parametri di prestazioni.................................................................................................................41 ANALISI STATISTICA DEI RISULTATI.......................................................................................42 Magazzino a coda multipla vs Magazzino a coda singola.............................................................42 ANALISI DEI RISULTATI...............................................................................................................42 Obiettivo 1.....................................................................................................................................42 Obiettivo 2.....................................................................................................................................45 1 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco 1. DESCRIZIONE DEL SISTEMA REALE E DEFINIZIONE DEGLI OBIETTIVI DELLO STUDIO 1.1 Descrizione qualitativa e funzionale del sistema reale Si vuole modellare un grande magazzino di articoli di abbigliamento costituita da vari reparti: Reparto abbigliamento uomo Reparto abbigliamento donna Reparto giacche Reparto calzature Reparto abbigliamento sportivo Nel magazzino sono inoltre presenti tre casse dove i clienti effettuano i pagamenti degli abiti acquistati. Nel magazzino sono presenti dei commessi così suddivisi: Due commessi lavorano nel reparto abbigliamento uomo Un commesso lavora nel reparto abbigliamento donna Due commessi lavorno nel reparto giacche Due commessi lavorano nel reparto calzature Tre commessi lavorano nel reparto abbigliamento sportivo Tre commessi lavorano alle casse gestendo ogniuno una propria cassa L'orario di apertura al pubblico del magazzino è: 09:00 13:00 15:00 19:00 dal Lunedì al Sabato. Il magazzino è diviso in cinque reparti dove lavorano i dieci commessi che non sono addetti alle casse. I reparti sono tra loro indipendenti, il ché significa che i commessi che lavorano in un reparto sono responsabili unicamente di quest'ultimo e non possono andare ad aiutare i propri collegni negli altri reparti. I commessi che lavorano nei reparti hanno due compiti principali: servire i clienti che entrano nei reparti e, qualora la merce da essi richiesta non fosse presente negli scaffali, andare in magazzino per reperire l'articolo desiderato. I clienti accedono al magazziono attraverso un'unica entrata per poi accodarsi in una delle cinque code che permettono l'accesso ai reparti (si ha quindi una coda distinta per ogni reparto del magazzino). Quando entrano nel magazziono i clienti hanno in mano una delle possibili undici liste della spesa elencate qui di segiuto: Lista uno: acquistare un vestito uomo Lista due: acquistare un vestito donna Lista tre: acquistare un paio di scarpe Lista quattro: acquistare un articolo nel reparto abbigliamento sportivo Lista cinque: acquistare una giacca Lista sei: acquistare un vestito uomo ed un paio di scarpe da abbinare al vestito 2 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco Lista sette: acquistare un vestito uomo ed una giacca da abbinare al vestito Lista otto: acquistare un vestito uomo, un paio di scarpe ed una giacca per fare un completo Lista nove: acquistare un vestito donna ed una giacca da abbinare al vestito Lista dieci: acquistare un vestito donna ed un paio di scarpe da abbinare al vestito Lista undici: acquistare un vestito donna, un paio di scarpe ed una giacca per fare un completo Data una determinata lista, il cliente sceglie a quale fila accodarsi in base alla lunghezza della stessa preferendo quindi effettuare gli acquisti nel reparto con la coda più breve. Terminati gli acquisti, il cliente si dirige verso le casse per effettuare il pagamento degli articoli acquistati oppure si dirige direttamente verso l'uscita se non ha acquistato nessun articolo. 1.2 Obiettivi dello studio di simulazione Si vogliono raggiungere due divesi tipi di obiettivi: da un lato si vuole determinare quale organizzazione sia migliore per il sistema in esame tra le due possibili soluzioni: Obiettivo 1 code multiple (come descritto sopra) sistema a coda unica dove l'organizzazione prevede la presenza di una sola coda che permette al cliente di riservarsi i servizi di un commesso il quale l'accompagnerà attraverso tutti i vari reparti del magazzino per permettere al cliente di effettuare i propri acquisti Determinata la soluzione migliore, verranno effettuati vari studi di capacity planning allo scopo di effettuare delle considerazioni sul sistema: Obiettivo 2 determinato il comportamento del modello ottimale in una situazione di workload normale, si vuole studiare il comportamento del modello in una situazione di workload straordinario (quale potrebbe essere ad es. il maggior lavoro che si riscontra durante il periodo natalizio) con l'intenzione di modificare il modello stesso in modo tale che la sua risposta si assesti ad un determinato livello prefissato. In particolare si vuole che il tempo di apertura straordinaria del magazzino si assesti intorno agli stessi valori che si sono riscontrati considerando un workload ordinario trovata la soluzione ottimale del punto precedente si vuole determinare se sia economicamente realizzabile e, in caso negativo, si vuole determinare quale configurazione sia economicamente ammissibile (considerando anche le assunzioni fatte di seguito) 2. ASSUNZIONI E MODELLO 2.1Assunzioni Per creare il modello dal sistema lineare si effettuano le seguenti assunzioni: 1. I clienti devono sempre essere accompagnati da un commesso quando visitano i reparti del magazzino 2. Il cliente che non effettua alcun acquisto in un reparto tiene comunque occupato un commesso 3 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco per lo stesso tempo di un cliente che invece effettua un acquisto 3. Il tempo impiegato da un cliente per acquistare un solo capo di abbibliamento è considerato identico a quello impiegato per acquistare n capi poiché si considera che il cliente acquisti vestiti della stessa taglia e di modelli simili; in tal modo il cliente deve provare un solo vestito e non tutti quelli che acquista 4. Deciso quali reparti visitare, il cliente sceglie l'ordine dei reparti in base alla lunghezza delle code ad essi associati decidendo in ordine crescente di lunghezza (quindi il primo reparto sarà quello con la coda più corta) 5. Si considerano nulli i tempi di spostamento del cliente da un reparto all'altro, si considerano altresì nulli il tempo di spostamento alle casse e quello per raggiungere l'uscita del magazzino (sia nel caso che il cliente abbia pagato alla cassa, sia nel caso che non abbia effettuato acquisti ed esca semplicemente dal magazzino) 6. Non si considera la gestione delle casse in quanto essa viene considerata identica in tutti gli scenari presi in considerazione; le casse dunque introducono solamente un intervallo ? che ritarda l'uscita dei clienti dal magazzino 7. I clienti che non scelono nessuna delle altre liste hanno in mano la lista quattro 8. L'orario di apertura del negozio è di quattro ore al mattina e quattro il pomeriggio. Essendo il tempo di apertura identico si è scelto di considerare solamente un tempo di simulazione pari amezza giornata (quattro ore) potendo assumere che le condizioni di operatività del magazzino siano identiche la mattina ed il pomeriggio 9. Si considera che qualora un articolo non sia presente sugli scaffali, sia comunque reperibile nel magazzino 10.I tempi di servizio nel modello a coda unica sono superiori rispetto a quelli del modello a code multiple poichè si assume che i commessi, non essendo vincolati ad un singolo reparto, non conoscano l'esatta disposizione degli articoli sugli scaffali. Tale assunzione non pregiudica la possibilità di confrontare i due modelli in quanto si è scelto come parametro di confronto il tempo trascorso in coda dai clienti per poter ottenere i servizi di un commesso senza considerare il tempo impiegato per effettuare gli acquisti e quello impiegato per il pagamento 11.Nel magazzino lavorano dieci commessi 12.I clienti che sono ancora presenti nel magazzino dopo la sua chiusura devono essere comunque serviti e gli deve essere data la possibilità di concludere i loro acquisti 13.Riguardo all'obiettivo2, si vuole che il guadagno al netto dei costi sia non inferiore ai 20000 € (ventimila euro) 2.2Descrizione qualitativa e funzionale del modello Partendo dal sistema reale, sulla base delle assunzioni fatte, si ricava che il sistema semplificato è costituito dai commessi che servono i clienti nei vari reparti del magazzino e da tre casse dove i clienti effettuano i pagamenti degli articoli acquistati. Nel modello ogni servente è associato ad un singolo reparto. Ogni servente è di tipo multiserver e vuole rappresentare tutti i commessi che lavorano nel reparto ad esso associato. I serventi associati alle tre casse, invece, rappresentano ognuno un addetto alla cassa. La politica di gestione delle code dei serventi è di tipo FCFS. Il cliente del magazzino deve accedere ai vari reparti nell'ordine prestabilito come nel sistema reale ed in base alle assunzioni effettuate. A seconda della lista della spesa che deve seguire sceglie qual'è la coda più corta tra quelle che deve seguire per effettuare i propri acquisti. Una volta terminato di usufruire dei servizi di un commesso in un reparto si mette in coda negli altri reparti 4 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco che deve visitare, sempre scegliendo quello con la coda minore. Terminato di visitare i reparti il cliente si dirige alle casse per pagare oppure si dirige direttamente verso l'uscita. I clienti che devono effettuare i pagamenti scelgono a quale cassa accodarsi in base alla lunghezza delle code scegliendo anche qui la più corta. Effettuato quindi il pagamento i clienti si avviano verso l'uscita del magazzino. Dove: prvuomo=probabilità che il cliente acquisti un vestito da uomo prvdonna=probabilità che il cliente acquisti un vestito da donna prvgiacche=probabilità che il cliente acquisti una giacca prvscarpe=probabilità che il cliente acquisti un paio di scarpe prt=prscarpe+prvuomo+prvdonna+prgiacche 1-prt=probabilità che il cliente acquisti qualcosa dal reparto abbigliamento sportivo (1-prt significa che la probabilità che i clienti acquistino in questo reparto è influenzata dall'assunzione fatta in precedenza che prevedere per i clienti l'obblico di acquistare nel reparto abbigliamento sportivo se non hanno optato per nessun altra lista) 5 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco 3. PARAMETRI DI INPUT NEL MODELLO I componenti che modellano i vari reparti del magazzino sono caratterizzati dai tempi di arrivo dei clienti alle rispettive code, dal tempo di servizio e dalla probabilità pri che il cliente effettui degli acquisti nell'i-esimo reparto. Si assume che la probabilità che un cliente effettui degli acquisti sia pari a p1. Il pagamento alle casse della merce acquistata è caratterizzato da un intervallo ? come già indicato nelle assunzioni. 4. CARATTERIZZAZIONE DEI PARMETRI DI INPUT DEL MODELLO WORKLOAD ANALISYS Il periodo preso in esame rappresenta una settimana tipo, senza quindi considerare periodi particolari come prossimità di festività o periodi di saldi. Da osservazioni sul campo si è riscontrata un'affluenza di circa 96 clienti (nelle quattro ore prese in esame) con un tasso medio di arrivo di un cliente ogni 2,5 minuti. Data l'indipendenza degli arrivi si sceglie di caratterizzare questa frequenza d'arrivo con una distribuzione di tipo esponenziale (Poisson). Dai dati raccolti si osserva che le la distribuzione delle probabilità che caratterizzano la scelta delle liste da parte dei clienti è la seguente: LISTA UNO 12% LISTA DUE 15% LISTA TRE 16% LISTA QUATRO 11% LISTA CINQUE 13% LISTA SEI 7% LISTA SETTE 5,5% LISTA OTTO 3,5% LISTA NOVE 7% LISTA DIECI 6,5% LISTA UNDICI 4,5% Ciò si riperquote sui vari reparti determinando le seguenti percentuali di affluenza dei clienti: Reparto vestiti uomo 28% Reparto vestiti donna 33% Reparto calzature 37,5% Reparto giacche 33,5% 6 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco Reparto vestiti uomo 28% Reparto articoli sportivi 55% - 65% Come già detto in precedenza, si deve sempre tenere presente l'assunzione fatta in precedenza riguardo gli acquisti nel reparto abigliamento sportivo. Considerando infine gli acquisti effettuati, si è osservato che il 70% circa dei clienti acquistano effettivamente della merce, mentre il restante 30% si limita ad osservare e quindi, uscito dai reparti, si dirige direttamente verso l'uscita. Per quanto riguarda il tempo di servizio dei serventi, si è deciso di considerare due diverse distribuzioni a seconda che l'articolo richiesto dal cliente sia presente o meno nel reparto. Si considera, ricordando anche le assunzioni fatte, che nel 90% dei casi (aritcolo presente nel reparto) il tempo di servizio sia modellato da una distribuzione uniforme di valori che variano da reparto a reparto e che sono qui sotto riportati: Modello a code separate Reparto vestiti uomo 10 min. - 20 min. Reparto vestiti donna 25 min. - 30 min. Reparto calzature 10 min. - 15 min. Reparto giacche 10 min. - 15 min. Reparto articoli sportivi 5 min. - 10 min. Per il rimanente 10% dei casi (articono non presente nel reparto) si utilizza una distribuzione gaussiana con valor medio e deviazione standard pari a: REPARTO MEDIA α DEVIAZIONE STANDARD σ Reparto vestiti uomo 20 min. 1,9 Reparto vestiti donna 35 min. 3 Reparto calzature 12 min. 1 Reparto giacche 13 min. 1 Reparto articoli sportivi 11 min. 1 I tempi di accodamento ad un reparto dipendono dai tempi di servizio dei commessi del reparto stesso. Per quanto riguarda le casse, secondo le assunzioni considerante esse introducono solamente un ritardo ? pari ad una distribuzione gauzziana con valor medio pari a 3 min. e deviazione standard pari a 1. 7 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco 5. MODELLI SEMPLIFICATI Al fine di analizzare separatamente gli obiettivi di cui al paragrafo 1.2 si è deciso di considerare un modello semplificato: si è infatti deciso di semplificare la parte relativa alle casse in quanto, essendo questa comune ad entrambe le soluzioni (serventi legati ai reparti oppure legati ai singoli clienti), non andrebbe ad aggiungere alcun contenuto informativo. Analoghe considerazioni sulla gestione delle casse del magazzino si sono fatte per ottenere il modello a coda unica di cui all'obiettivo uno (se ne discuterà nel capitolo dei modelli alternativi). I dati relativi al workload dei singoli modelli semplificati sono presi direttamente dalla workload analisys del modello generale. 8 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco 6. STESURA DEL CODICE Per implementare il simulatore si è utilizzato il linguaggio C e la versione 18 della libreria CSIM per sistemi Lynux. 6.1Strutture dati usate nella simulazione del magazzino a coda multipla Per modellare i reparti si sono utilizzate delle multiserver facility utilizzando una politica di gestione delle code di tipo FCFS. Gli arrivi dei clienti sono rappresentati da una distribuzione di tipo esponenziale con valore medio di 24 arrivi all'ora (un arrivo ogni 2,5 min.). Per i tempi di servizio delle facilities si è invece utilizzata una distribuzione non analitica data da una distribuzione uniforme nel 90% dei casi (il servente può esaudire le richieste pervenute) e da una distribuzione gaussiana nel restante 10% dei casi (il servente deve ristabilire le normali condizioni di servizio). Gli utenti all'interno del simulatore non seguono un unico flusso, ma si spostano da un reparto all'altro a seconda delle loro esigenze. Terminato di usufruire dei servizi dei serventi, i clienti 9 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco sostano per ? minuti (simulazione del pagamento) e poi escono oppure escono direttamente (simulazione dei mancati acquisti). Per l'esecuzione del programma si è utilizzato il metodo delle prove ripetute considerando anche i dati provenienti dal transitorio iniziale e da quello finale che, sulla base di osservazioni sul campo, sono stati stimati in 30 min. per il primo e di 45 min. per il secondo. Il debugging del simulatore è stato realizzato utilizzando delle funzioni printf che sono state aggiunte al codice per verificare la correttezza del percorso seguito dal cliente. È stato inoltre verificato che le distribuzioni utilizzate sia per i tempi di servizio che per la generazione dei tempi di interarrivo fossero aderenti alla realtà. Di seguito viene presentato il codice relativo al modello descritto: //============================================================================== // //MODELLO 2: CODA SEPARATE: OGNI COMMESSO SI OCCUPA DEL PRORIO REPARTO // //============================================================================== #include <stdlib.h> #include <stdio.h> #include <csim.h> //============================================================================== //definizione di costanti //============================================================================== #define mattina (13-9)*60.0 //minuti di apertura del magazzino #define f_name "negozio.out" #define m_name "Commessi associati ai reparti" //probabilità che il cliente effettui acquisti in un reparto piuttosto //che in un altro #define #define #define #define #define #define #define #define #define #define #define lista1 0.12 lista2 0.15 lista3 0.16 lista4 0.11 lista5 0.13 lista6 0.07 lista7 0.055 lista8 0.035 lista9 0.07 lista10 0.065 lista11 0.045 #define pr1 0.7 //probabilità che un cliente effettui degli acquisti //============================================================================== //VARIABILI GLOBALI //============================================================================== FACILITY FACILITY FACILITY FACILITY FACILITY reparto0; reparto1; reparto2; reparto3; reparto4; //repartouomo //repartodonna //repartogiacche //repartoscarpe //repartosport 10 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco int aperto; int prove; //1-aperto, 0-chiuso //numero di run da effettuare TIME tempo; EVENT magazzinovuoto; TABLE waitTime; TABLE risultati; //tempi di attesa dei clienti (ingresso---casse escluse) //risultati prove ripetute TABLE incodauomo; //tempo parziale in coda reparto uomo TABLE risincodauomo; //tempo totale in coda reparto uomo TABLE incodadonna; //tempo parziale in coda reparto donna TABLE risincodadonna; //tempo totale in coda reparto donna TABLE incodagiacche; //tempo parziale in coda reparto giacche TABLE risincodagiacche; //tempo totale in coda reparto giacche TABLE incodascarpe; //tempo parziale in coda reparto scarpe TABLE risincodascarpe; //tempo totale in coda reparto scarpe TABLE incodasport; //tempo parziale in coda reparto sportivo TABLE risincodasport; //tempo totale in coda reparoto sportivo TABLE inmagaz; //tempo parziale trascorso in magazzino TABLE risinmagaz; //tempo totale trascorso in magazzino TABLE riassunto; //riassunto dei tempi di attesa nelle code dei vari reparti TABLE apertura; //tempo trascorso per smaltire i clienti dalla chiusura del //magazzino fino al suo svuotamento long cli, nvuomo, nvdonna, ngiacche, nsport, nscarpe; //cli: numero totale di clienti presenti nel magazzino //nvuomo, nvdonna, ngiacchem nsportm nscarpe: numero totale di persone che hanno //richiesto i servizi dei commessi di un determinato reparto double arrivi; //tempo di interarrivo dei clienti nel magazzino char* filename; //output file negozio coda unica FILE* fp; //============================================================================== //PROTOTIPI DI FUNZIONI //============================================================================== void void void void void void void void void void void void void genera(void); //funzione che simula l'arrivo dei clienti cliente(void); cliente1(void); //cliente che ha la lista 1 cliente2(void); //cliente che ha la lista 2 cliente3(void); //cliente che ha la lista 3 cliente4(void); //cliente che ha la lista 4 cliente5(void); //cliente che ha la lista 5 cliente6(void); //cliente che ha la lista 6 cliente7(void); //cliente che ha la lista 7 cliente8(void); //cliente che ha la lista 8 cliente9(void); //cliente che ha la lista 9 cliente10(void); //cliente che ha la lista 10 cliente11(void); //cliente che ha la lista 11 //============================================================================== //MAIN PROGRAM //============================================================================== 11 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco void sim(int argc, char* argv[]) { //inizializzazione fuori dal ciclo if(argc > 1) prove=atoi(argv[1]); else prove=1; if (argc > 2) filename=argv[2]; else filename=f_name; if (argc > 3) arrivi=atoi(argv[3]); else arrivi=2.5; //24 persone all'ora fp=fopen(filename, "w"); set_output_file(fp); fprintf(fp, "Simulazione: %s, seme: %ld\n\n", m_name, stream_state(NIL)); //Inizializzazione tabelle di tempi di attesa complessivi risultati = permanent_table("Tempo trascorso nel negozio senza considerare le casse"); risincodauomo=permanent_table("Tempo totale trascorso in coda nel reparto vesiti uomo"); risincodadonna=permanent_table("Tempo totale trascorso in coda nel reparto vestiti donna"); risincodagiacche=permanent_table("Tempo totale trascorso in coda nel reparto giacche"); risincodascarpe=permanent_table("Tempo totale trascorso in coda nel reparto scarpe"); risincodasport=permanent_table("Tempo totale trascorso in coda nelreparto sportivo"); risinmagaz=permanent_table("Tempo totale trascorso in magazzino da un cliente"); riassunto=permanent_table("Riassunto tempo di attesa in coda nei reparti"); apertura=permanent_table("Tempo di smaltimento del magazzino"); //============================================================================= //Ceazione della simulazione //============================================================================= set_model_name(m_name); while(prove > 0) { create("sim"); //inizializzazione dei reparti (serventi) reparto0=facility_ms("rep.uomo", 2); //2 commessi reparto1=facility_ms("rep.donna", 1); //1 commesso reparto2=facility_ms("rep.giacche", 2); //2 commessi reparto3=facility_ms("rep.scarpe", 2); //2 commessi reparto4=facility_ms("rep.sportivo", 3); //3 commessi magazzinovuoto=event("Magazzino vuoto"); waitTime = table("varie code + acquisti"); incodauomo=table("coda reparto uomo"); inmagaz=table("code + casse + acquisti"); incodadonna=table("coda reparto donna"); incodagiacche=table("coda reparto giacche"); incodascarpe=table("coda reparto scarpe"); incodasport=table("coda reparto sportivo"); //inizio simulazione del magazzino //apertura del magazzino alla mattina cli=0; aperto=1; nvuomo=0; nvdonna=0; ngiacche=0; nsport=0; 12 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco nscarpe=0; genera(); hold(mattina); tempo=clock; aperto=0; if(cli > 0) { wait(magazzinovuoto); } record(table_mean(waitTime), risultati); record(table_mean(inmagaz), risinmagaz); record(table_mean(incodauomo), risincodauomo); record(table_mean(incodadonna), risincodadonna); record(table_mean(incodagiacche), risincodagiacche); record(table_mean(incodascarpe), risincodascarpe); record(table_mean(incodasport), risincodasport); //raccolta dati dei reparti in un'unica tabella riassuntiva record(table_mean(incodauomo), riassunto); record(table_mean(incodadonna), riassunto); record(table_mean(incodagiacche), riassunto); record(table_mean(incodascarpe), riassunto); record(table_mean(incodasport), riassunto); record(clock-tempo, apertura); report(); //decremento il numero di run rimasti da eseguire prove--; if (prove <= 0) break; rerun(); } fprintf(fp, "\n\nDati complessivi\n\n"); report_table(risultati); report_table(risinmagaz); report_table(risincodauomo); report_table(risincodadonna); report_table(risincodagiacche); report_table(risincodascarpe); report_table(risincodasport); report_table(riassunto); report_table(apertura); fprintf(fp, "\n\nDescrizione dei reparti:\n\n"); fprintf(fp, "uomo: %ld\ndonna: %ld\ngiacche: %ld\nscarpe: %ld\nsport: %ld\n", nvuomo, nvdonna, ngiacche, nscarpe, nsport); fclose(fp); } //=========================================================================== // FUNZIONE genera() - simula l'arrivo dei clienti al magazzino //=========================================================================== void genera(void) 13 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco { create ("genera"); while(aperto) { hold(exponential(arrivi)); cliente(); } } void cliente(void) {int giacche, vuomo, vdonna, scarpe, sport; double scelta, prvuomo, prvdonna, prgiacche, prscarpe; create("cliente"); giacche=0; vuomo=0; vdonna=0; scarpe=0; sport=0; prvuomo=lista1 + lista6 + lista7 + lista8; prvdonna=lista2+ lista9+ lista10+ lista11; prgiacche=lista5 + lista7 + lista8 + lista9 + lista11; prscarpe=lista3 + lista6 + lista8 + lista10 + lista11; scelta = uniform(0.0, 1.0); if(scelta < prvuomo) { vuomo=1; nvuomo++; //la mia lista della spesa comprende un vestito da uomo } if((vuomo==0) && (scelta < prvdonna)) { vdonna=1; //la lista della spesa comprende un vestido da donna nvdonna++; } if(scelta < prgiacche) { giacche=1; //devo comprare anche una giacca ngiacche++; } if(scelta < prscarpe) { scarpe=1; nscarpe++; } if((vuomo==0) && (vdonna==0) && (giacche==0) &&(scarpe==0)) { sport=1; nsport++; } //generazione dei clienti if((vuomo==1)&&(giacche==0)&&(scarpe==0)&&(sport==0)) { //il cliente entra nel negozio con in mano la lista1 cliente1(); } else if((giacche==0)&&(vdonna==1)&&(scarpe==0)&&(sport==0)) { //il cliente entra nel negozio con in mano la lista2 cliente2(); } else if((vuomo==0)&&(giacche==0)&&(vdonna==0)&&(scarpe==1)&&(sport==0)) { //il cliente entra nel negozio con in mano la lista3 cliente3(); } 14 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco else if(sport==1) { //il cliente entra nel negozio con in mano la lista4 cliente4(); } else if((vuomo==0)&&(giacche==1)&&(vdonna==0)&&(scarpe==0)&&(sport==0)) { //il cliente entra nel negozio con in mano la lista5 cliente5(); } else if((vuomo==1)&&(scarpe==1)) { //il cliente entra nel negozio con in mano la lista6 cliente6(); } else if((vuomo==1)&&(giacche==1)) { //il cliente entra nel negozio con in mano la lista7 cliente7(); } else if((vuomo==1)&&(giacche==1)&&(scarpe==1)) { //il cliente entra nel negozio con in mano la lista8 cliente8(); } else if((giacche==1)&&(vdonna==1)) { //il cliente entra nel negozio con in mano la lista9 cliente9(); } else if((vdonna==1)&&(scarpe==1)) { //il cliente entra nel negozio con in mano la lista10 cliente10(); } else if((giacche==1)&&(vdonna==1)&&(scarpe==1)) { //il cliente entra nel negozio con in mano la lista11 cliente11(); } } //FUNZIONE cliente1() - simula il comportamento di un cliente del // che ha la lista 1 (VESTITO UOMO) void cliente1(void) { //dichiarazione di variabili locali double temposerv; TIME ti; //tempo che impiega un commesso a servire il cliente create("cliente1"); cli++; ti=clock; reserve(reparto0); //il cliente visita il repartounomo 15 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco record(clock-ti, incodauomo); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 20.0); //vestito disponibile hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } else { do temposerv=normal(20.0, 1.9); //vestito non disponibile media e varianza while(temposerv<0); hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } release(reparto0); record(clock-ti, waitTime); //gestione casse per il pagamento if(uniform(0.0, 1.0)<=pr1) { do temposerv=normal(3.0, 0.5); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); } //FUNZIONE cliente2() - simula il comportamento di un cliente del // che ha la lista 2 (VESTITO DONNA) void cliente2(void) { //dichiarazione di variabili locali double temposerv; TIME ti; //tempo che impiega un commesso a servire il cliente create("cliente2"); cli++; ti=clock; reserve(reparto1); //il cliente visita il repartodonna record(clock-ti, incodadonna); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(25.0, 30.0); //vestito disponibile hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } else { do temposerv=normal(35.0, 3.0); //vestito non disponibile media e varianza while(temposerv<0); hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } release(reparto1); record(clock-ti, waitTime); //il cliente paga alla cassa if(uniform(0.0, 1.0)<=pr1) { do temposerv=normal(3.0, 1.0); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); 16 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco } //FUNZIONE cliente3() - simula il comportamento di un cliente del // che ha la lista 3 (SCARPE) void cliente3(void) { //dichiarazione di variabili locali double temposerv; TIME ti; //tempo che impiega un commesso a servire il cliente create("cliente3"); cli++; ti=clock; reserve(reparto3); //il cliente visita il reparto scarpe record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //scarpe disponibili hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } else { do temposerv=normal(12.0, 1.0); //scarpe non disponibili media e varianza while(temposerv<0); hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } release(reparto3); record(clock-ti, waitTime); if(uniform(0.0, 1.0)<=pr1); { do temposerv=normal(3.0, 1.0); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); } //FUNZIONE cliente4() - simula il comportamento di un cliente del // che ha la lista 4 (ARTICOLI SPORTIVI) void cliente4(void) { //dichiarazione di variabili locali double temposerv; TIME ti; //tempo che impiega un commesso a servire il cliente create("cliente4"); cli++; ti=clock; reserve(reparto4); //il cliente visita il reparto sportivo record(clock-ti, incodasport); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(5.0, 10.0); ////articolo sportivo disponibile hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } else { do temposerv=normal(11.0, 1.0); // articolo sportivo non disponibile 17 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco while(temposerv<0); // media e varianza hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } release(reparto4); record(clock-ti, waitTime); if(uniform(0.0, 1.0)<=pr1) { do temposerv=normal(3.0, 1.0); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); } //FUNZIONE cliente5() - simula il comportamento di un cliente del // che ha la lista 5 (REPARTO GIACCHE) void cliente5(void) { //dichiarazione di variabili locali double temposerv; TIME ti; //tempo che impiega un commesso a servire il cliente create("cliente5"); cli++; ti=clock; reserve(reparto2); //il cliente visita il reparto giacche record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); ////giacca disponibile hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } else { do temposerv=normal(13.0, 1.0); //giacca non disponibile media e varianza while(temposerv<0); hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } release(reparto2); record(clock-ti, waitTime); if(uniform(0.0, 1.0)<=pr1) { do temposerv=normal(3.0, 1.0); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); } //FUNZIONE cliente6() - simula il comportamento di un cliente del // che ha la lista 6 (VESTITO UOMO + SCARPE) void cliente6(void) { //dichiarazione di variabili locali double temposerv; //tempo che impiega un commesso a servire il cliente 18 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco TIME ti; create("cliente6"); cli++; ti=clock; // sceglie il reparto con la coda più corta if(qlength(reparto0)< qlength(reparto3)) {//entro nel reparto vestiti da uomo reserve(reparto0); record(clock-ti, incodauomo); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 20.0); //vestito disponibile hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(20.0, 1.9); //vestito non disponibile while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto0); // dopodiché visito il reparto SCARPE reserve(reparto3); //il cliente visita il reparto scarpe record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //scarpe disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(12.0, 1.0); //scarpe non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto3); record(clock-ti, waitTime); } else { // VISITO PRIMA IL REPARTO SCARPE reserve(reparto3); //il cliente visita il reparto scarpe record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //scarpe disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(12.0, 1.0); //scarpe non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto3); //DOPODICHE VISITO IL REPARTO VESTITI UOMO reserve(reparto0); record(clock-ti, incodauomo); if(uniform(0.0, 1.0)<=0.9) 19 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco { temposerv=uniform(10.0, 20.0); //vestito disponibile hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(20.0, 1.9); //vestito non disponibile while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto0); record(clock-ti, waitTime); } if(uniform(0.0, 1.0)<=pr1) { do temposerv=normal(3.0, 1.0); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); } //FUNZIONE cliente7() - simula il comportamento di un cliente del // che ha la lista 7 (VESTITO UOMO + GIACCA) void cliente7(void) { //dichiarazione di variabili locali double temposerv; TIME ti; //tempo che impiega un commesso a servire il cliente create("cliente7"); cli++; ti=clock; // sceglie il reparto con la coda più corta if(qlength(reparto0)< qlength(reparto2)) { reserve(reparto0); record(clock-ti, incodauomo); //visito prima il Reparto VESTITI UOMO if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 20.0); //vestito disponibile hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(20.0, 1.9); //vestito non disponibile while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto0); // dopodiché visito il reparto GIACCHE reserve(reparto2); //il cliente visita il reparto scarpe record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) 20 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco { temposerv=uniform(10.0, 15.0); //scarpe disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(13.0, 1.0); //giacche non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto2); record(clock-ti, waitTime); } else { // VISITO PRIMA IL REPARTO GIACCHE reserve(reparto2); //il cliente visita il reparto giacche record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //GIACCHE disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(13.0, 1.0); //GIACCHE non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto2); //DOPODICHE VISITO IL REPARTO VESTITI UOMO reserve(reparto0); record(clock-ti, incodauomo); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 20.0); //vestito disponibile hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(20.0, 1.9); //vestito non disponibile while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto0); record(clock-ti, waitTime); } if(uniform(0.0, 1.0)<=pr1) { do temposerv=normal(3.0, 1.0); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); } 21 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco //FUNZIONE cliente8() - simula il comportamento di un cliente del // che ha la lista 8 (VESTITO UOMO + SCARPE + GIACCA) void cliente8(void) { //dichiarazione di variabili locali long a, b, c, min; // Variabili d'appoggio per la lunghezza delle code double temposerv; //tempo che impiega un commesso a servire il cliente TIME ti; create("cliente8"); cli++; ti=clock; // sceglie il reparto con la coda più corta a= qlength(reparto0); b= qlength(reparto3); c= qlength(reparto2); min=a; if(min>b) min=b; if(min>c) min=c; //andiamo a valutare l'ordine con cui il cliente entra nei vari reparti if(min==a) { //il cliente entra nella coda del reparto vestiti uomo reserve(reparto0); record(clock-ti, incodauomo); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 20.0); //vestito disponibile hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(20.0, 1.9); //vestito non disponibile while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto0); //ricalcolo la lunghezza delle code degli altri due reparti b=qlength(reparto3); c=qlength(reparto2); //il cliente sceglie quale reparto fare per secondo e quale fare per terzo if(b<c) {//andiamo nel reparto scarpe reserve(reparto3); //il cliente visita il reparto scarpe record(clock-ti, incodascarpe); //Reparto SCARPE if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //scarpe disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(12.0, 1.0); //scarpe non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio 22 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco } release(reparto3); //siamo appena usciti dal reparto scarpe //ora entriamo nel reparto giacche reserve(reparto2); //il cliente visita il reparto giacche record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //GIACCHE disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(13.0, 1.0); //GIACCHE non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto2); record(clock-ti, waitTime); } else {//andiamo nel reparto giacche reserve(reparto2); //il cliente visita il reparto giacche record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //GIACCHE disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(13.0, 1.0); //GIACCHE non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto2); //ora entriamo nel reparto scarpe reserve(reparto3); //il cliente visita il reparto scarpe record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //scarpe disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(12.0, 1.0); //scarpe non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto3); record(clock-ti, waitTime); } } if(min==b) { //il cliente entra nella coda del reparto scarpe reserve(reparto3); record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) 23 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(12.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto3); //ricalcolo la lunghezza delle code degli altri due reparti a=qlength(reparto0); c=qlength(reparto2); if(a<c) { //andiamo nel reparto vesiti da uomo reserve(reparto0); record(clock-ti, incodauomo); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 20.0); hold(temposerv); } else { do temposerv=normal(20.0, 1.9); while(temposerv<0); hold(temposerv); } release(reparto0); //ora andiamo nel reparto giacche reserve(reparto2); record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(13.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto2); record(clock-ti, waitTime); } else { //andiamo prima nel reparto giacche reserve(reparto2); record(clock-ti, incodagiacche); if(uniform(0.0, 1.0) <= 0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(13.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto2); //ora entriamo nel reparto vestiti da uomo 24 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco reserve(reparto0); record(clock-ti, incodauomo); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 20.0); hold(temposerv); } else { do temposerv=normal(20.0, 1.9); while(temposerv<0); hold(temposerv); } release(reparto0); record(clock-ti, waitTime); } } if(min==c) { //il cliente entra nella coda del reparto giacche reserve(reparto2); record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(13.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto2); //ricalcolo la lunghezza delle code degli altri due reparti a=qlength(reparto0); b=qlength(reparto3); if(a<b) { //andiamo nel reparto vestiti da uomo reserve(reparto0); record(clock-ti, incodauomo); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 20.0); hold(temposerv); } else { do temposerv=normal(20.0, 1.9); while(temposerv<0); hold(temposerv); } release(reparto0); //andiamo nel reparto scarpe reserve(reparto3); record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(12.0, 1.0); while(temposerv<0); hold(temposerv); } 25 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco release(reparto3); record(clock-ti, waitTime); } else { //andiamo nel reparto scarpe reserve(reparto3); record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(12.0, 1.0); while(temposerv<0); hold(temposerv); } //andiamo nel reparto vestiti da uomo reserve(reparto0); record(clock-ti, incodauomo); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 20.0); hold(temposerv); } else { do temposerv=normal(20.0, 1.9); while(temposerv<0); hold(temposerv); } release(reparto0); record(clock-ti, waitTime); } } if(uniform(0.0, 1.0)<=pr1) { do temposerv=normal(3.0, 1.0); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); } //FUNZIONE cliente9() - simula il comportamento di un cliente del // che ha la lista 7 (VESTITO DONNA + GIACCA) void cliente9(void) { //dichiarazione di variabili locali double temposerv; TIME ti; //tempo che impiega un commesso a servire il cliente create("cliente9"); cli++; ti=clock; // sceglie il reparto con la coda più corta if(qlength(reparto1)< qlength(reparto2)) 26 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco {//entro nel reparto vestiti da donna reserve(reparto1); record(clock-ti, incodadonna); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(25.0, 30.0); //vestito disponibile hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(35.0, 3.0); //vestito non disponibile while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto1); // dopodiché visito il reparto GIACCHE reserve(reparto2); //il cliente visita il reparto scarpe record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //scarpe disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(13.0, 1.0); //giacche non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto2); record(clock-ti, waitTime); } else { // VISITO PRIMA IL REPARTO GIACCHE reserve(reparto2); //il cliente visita il reparto giacche record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //GIACCHE disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(13.0, 1.0); //GIACCHE non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto2); //DOPODICHE VISITO IL REPARTO VESTITI DONNA reserve(reparto1); record(clock-ti, incodadonna); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(25.0, 30.0); //vestito disponibile hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(35.0, 3.0); //vestito non disponibile 27 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto1); record(clock-ti, waitTime); } if(uniform(0.0, 1.0)<=pr1) { do temposerv=normal(3.0, 1.0); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); } //FUNZIONE cliente10() - simula il comportamento di un cliente del // che ha la lista 6 (VESTITO DONNA + SCARPE) void cliente10(void) { //dichiarazione di variabili locali double temposerv; TIME ti; //tempo che impiega un commesso a servire il cliente create("cliente10"); cli++; ti=clock; // sceglie il reparto con la coda più corta if(qlength(reparto1)< qlength(reparto3)) { //record(qlength(reparto1), lungdonna); reserve(reparto1); record(clock-ti, incodadonna); //visito prima il Reparto VESTITI DONNA if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(25.0, 30.0); //vestito disponibile hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(35.0, 3.0); //vestito non disponibile while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto1); // dopodiché visito il reparto SCARPE reserve(reparto3); //il cliente visita il reparto scarpe record(clock-ti, incodascarpe); // Reparto SCARPE if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //scarpe disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio 28 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco } else { do temposerv=normal(12.0, 1.0); //scarpe non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto3); record(clock-ti, waitTime); } else { // VISITO PRIMA IL REPARTO SCARPE reserve(reparto3); //il cliente visita il reparto scarpe record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); //scarpe disponibili hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(12.0, 1.0); //scarpe non disponibili while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto3); //DOPODICHE VISITO IL REPARTO VESTITI DONNA reserve(reparto1); record(clock-ti, incodadonna); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(25.0, 30.0); //vestito disponibile hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } else { do temposerv=normal(35.0, 3.0); //vestito non disponibile while(temposerv<0); hold(temposerv); // il cliente si ferma per la durata // del tempo di servizio } release(reparto1); record(clock-ti, waitTime); } if(uniform(0.0, 1.0)<=pr1) { do temposerv=normal(3.0, 1.0); while(temposerv<0); hold(temposerv); } record(clock-ti, inmagaz); cli--; if(aperto==0 && cli==0) set(magazzinovuoto); } //FUNZIONE cliente11() - simula il comportamento di un cliente del // che ha la lista 8 (VESTITO UOMO + SCARPE + GIACCA) void cliente11(void) 29 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco { //dichiarazione di variabili locali long a, b, c, min; // Variabili d'appoggio per la lunghezza delle code double temposerv; //tempo che impiega un commesso a servire il cliente TIME ti; create("cliente11"); cli++; ti=clock; // sceglie il reparto con la coda più corta a= qlength(reparto1); b= qlength(reparto3); c= qlength(reparto2); min=a; if(min>b) min=b; if(min>c) min=c; //valutiamo l'ordine con cui il cliente entra nei vari reparti if(min==a) { //il cliente entra nella coda vestiti donna reserve (reparto1); record(clock-ti, incodadonna); if(uniform(0.0, 1.0)<=1.0) { temposerv=uniform(25.0, 30.0); hold(temposerv); } else { do temposerv=normal(35.0, 3.0); while(temposerv<0); hold(temposerv); } release(reparto1); //ricalcolo la lunghezza delle code degli altri due reparti b=qlength(reparto3); c=qlength(reparto2); if(b<c) { //andiamo nel reparto scarpe reserve(reparto3); record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(12.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto3); //entriamo nel reparto giacche reserve(reparto2); record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { 30 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco do temposerv=normal(13.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto2); record(clock-ti, waitTime); } else { //andiamo prima nel reparto giacche reserve(reparto2); record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(13.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto2); //entriamo nel reparto scarpe reserve(reparto3); record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(12.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto3); record(clock-ti, waitTime); } } if(min==b) { //entriamo prima nella coda del reparto scarpe reserve(reparto3); record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(12.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto3); //ricalcolo la lungezza della coda degli altri due reparti a=qlength(reparto1); c=qlength(reparto2); if(a<c) { //andiamo al reparto vestiti da donna reserve(reparto1); record(clock-ti, incodadonna); if(uniform(0.0, 1.0)<=0.9) 31 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco { temposerv=uniform(25.0, 30.0); hold(temposerv); } else { do temposerv=normal(35.0, 3.0); while(temposerv<0); hold(temposerv); } release(reparto1); //andiamo nel reparto giacche reserve(reparto2); record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(13.0, 1.0); while(temposerv<0); } release(reparto2); record(clock-ti, waitTime); } else { //andiamo prima nel reparto giacche reserve(reparto2); record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(13.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto2); //entriamo nel reparto vestiti da donna reserve(reparto1); record(clock-ti, incodadonna); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(25.0, 30.0); hold(temposerv); } else { do temposerv=normal(35.0, 3.0); while(temposerv<0); } release(reparto1); record(clock-ti, waitTime); } } if(min==c) { //il cliente entra nella coda del reparto giacche reserve(reparto2); record(clock-ti, incodagiacche); if(uniform(0.0, 1.0)<=0.9) { 32 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(12.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto2); //ricalcolo la lunghezza delle code degli altri due reparti a=qlength(reparto1); b=qlength(reparto3); if(a<b) { //andiamo nel reparto vestiti da donna reserve(reparto1); record(clock-ti, incodadonna); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(25.0, 30.0); hold(temposerv); } else { do temposerv=normal(35.0, 3.0); while(temposerv<0); hold(temposerv); } release(reparto1); //andiamo nel reparto scarpe reserve(reparto3); record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(12.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto3); record(clock-ti, waitTime); } else { //andiamo nel reparto scarpe reserve(reparto3); record(clock-ti, incodascarpe); if(uniform(0.0, 1.0)<=0.9) { temposerv=uniform(10.0, 15.0); hold(temposerv); } else { do temposerv=normal(12.0, 1.0); while(temposerv<0); hold(temposerv); } release(reparto3); //andiamo nel reparto vestiti da donna reserve(reparto1); record(clock-ti, incodadonna); if(uniform(0.0, 1.0)<=0.9) 33 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco { temposerv=uniform(25.0, 30.0); hold(temposerv); } else { do temposerv=normal(35.0, 3.0); while(temposerv<0); hold(temposerv); } release(reparto1); record(clock-ti, waitTime); } } } 6.2Strutture dati usate nella simulazione del magazzino a coda unica In questo caso i serventi sono associati ai singoli commessi che lavorano nei reparti del negozio. Per modellarli si è utilizzata un'unica multiserver facility utilizzando anche qui una politica di gestione delle code di tipo FCFS. Gli arrivi dei clienti alla coda della facility sono determinati da una funzione di distribuzione di tipo esponenziale con valore medio di 24 arrivi all'ora. Per i tempi di servizio della facility si è invece utilizzata una distribuzione non analitica data da una distribuzione uniforme nel 90% dei casi (il servente può esaudire le richieste pervenute) e da una distribuzione gaussiana nel restante 10% dei casi (il servente deve ristabilire le normali condizioni di servizio). All'interno del simulatore gli utenti seguono un unico flusso essendo presente una sola facility. Terminato di usufruire dei servizi del servente, ogni cliente sostano per ? minuti (simulazione del pagamento) e poi si avviano verso l'uscita; in alternativa i clienti escono direttamente dal magazzino (simulazione dei mancati acquisti). Per l'esecuzione del programma si è utilizzato il metodo delle prove ripetute considerando anche i dati provenienti dal transitorio iniziale e da quello finale che, sulla base di osservazioni sul campo, sono stati stimati in 30 min. per il primo e di 45 min. per il secondo. Il debug del simulatore è stato realizzato utilizzando delle funzioni printf che sono state aggiunte al codice per verificare la correttezza del percorso seguito dal cliente. È stato inoltre verificato che le distribuzioni utilizzate sia per il tempo di servizio che per la gestione dei tempi di interarrivo fossero aderenti alla realtà. Di seguito viene presentato il codice relativo al modello descritto: //MODELLO 1: CODA UNICA: I COMMESSI SEGUONO PERSONALMENTE I SINGOLI CLIENTI // // // // #include <stdlib.h> #include <stdio.h> #include <csim.h> //definizione di costanti 34 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco #define mattina (13-9)*60.0 //minuti di apertura di mattina #define f_name "negozio.out" #define m_name "Commessi associati ai clienti" //probabilità che il cliente effettui acquisti in un reparto piuttosto //che in un altro #define #define #define #define #define #define #define #define #define #define #define lista1 0.12 //vestito uomo lista2 0.15 //vestito donna lista3 0.16 //scarpe lista4 0.11 //sport lista5 0.13 //giacche lista6 0.07 //v.uomo+scarpe lista7 0.055 //v.uomo+giacca lista8 0.035 //v.uomo+giacca+scarpa lista9 0.07 //giacca+v.donna lista10 0.065 //scarpe+v.donna lista11 0.045 //giacca+v.donna+scarpe #define p1 0.7 //probabilità che un cliente effettui degli acquisti //VARIABILI GLOBALI FACILITY reparto; double arrivi; int aperto; int prove; //tempo medio di arrivo tra due clienti (espresso in minuti) //1-aperto, 0-chiuso //numero di run da effettuare EVENT magazzinovuotomattina; TABLE waitTime; //tempi di attesa dei clienti (ingresso---casse escluse) //rappresenta il tempo trascorso in coda e quello trascorso per gli acquisti TABLE risultati; //risultati prove ripetute TABLE inmagaz; //tempo totale trascorso nel magazzino (compreso il tempo per //il pagamento alle casse TABLE incoda; //tempo trascorso in coda per aspettare i commessi TABLE risultatiincoda; TABLE risultatiinmagaz; //risultati prove ripetute long cli; char* filename; // output file negozio coda unica FILE* fp; void genera(void); void cliente(void); //funzione che simula l'arrivo dei clienti (Poisson) //simula il cliente del negozio a coda unica //MAIN PROGRAM void sim(int argc, char* argv[]) { //inizializzazione fuori dal ciclo if(argc > 1) prove=atoi(argv[1]); else prove=1; if (argc > 2) filename=argv[2]; else filename=f_name; if(argc>3) arrivi=atof(argv[3]); else 35 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco arrivi=2.5; //24 persone all'ora fp=fopen(filename, "w"); set_output_file(fp); fprintf(fp, "Simulazione: %s, seme: %ld\n", m_name, stream_state(NIL)); //Inizializzazione tabelle di tempi di attesa complessivi risultati = permanent_table("Tempo trascorso in magazzino senza considerare le casse"); risultatiinmagaz=permanent_table("Tempo totale trascorso in magazzino"); risultatiincoda=permanent_table("Tempo totale trascorso in coda"); //Ceazione della simulazione set_model_name(m_name); while(prove > 0) { create("sim"); //inizializzazioni della simulazione //inizializzazione dei commessi (serventi) reparto=facility_ms("commesso", 10); magazzinovuotomattina=event("Magazzino vuoto alla mattina"); waitTime = table("Coda + acquisti singolo run"); inmagaz=table("Coda + acquisti + cassa singolo run"); incoda=table("Coda singolo run"); //inizio simulazione //avvia, genera e mantiene aperto il negozio per il tempo di simulaz. //dato dalla somma di mattina e pomeriggio, considerando che durante //la pausa pranzo il negozio chiude //apertura de magazzino alla mattina cli=0; aperto=1; genera(); hold (mattina); //chiusura del magazzino per pausa pranzo aperto=0; if(cli > 0) wait(magazzinovuotomattina); //il magazzino è vuoto //Creazione del Report record(table_mean(waitTime), risultati); record(table_mean(inmagaz), risultatiinmagaz); record(table_mean(incoda), risultatiincoda); report(); //decremento il numero di run rimasti da eseguire prove--; if (prove <= 0) break; rerun(); } fprintf(fp, "\n\nDati riassuntivi\n\n"); report_table(risultati); report_table(risultatiinmagaz); report_table(risultatiincoda); fclose(fp); } //FUNZIONE genera() - simula l'arrivo dei clienti al magazzino 36 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco void genera(void) { create("genera"); //ciclo per simulare l'arrivo dei clienti con distibuz. di Poisson while(aperto) { hold(exponential(arrivi)); cliente(); } } //FUNZIONE cliente() - simula il comportamento di un cliente del magazzino void cliente(void) { //dichiarazione di variabili locali int giacche, vuomo, vdonna, sport, scarpe; //flags per determinare la //lista che li cliente segue per fare la spesa double temposerv, scelta, prvuomo, prvdonna, prgiacche, prsport, prscarpe; //reparto per reparto TIME ti; create("cliente"); cli++; //inizializzazione flags giacche = 0; vuomo = 0; vdonna = 0; sport = 0; scarpe = 0; ti=clock; //scelta della lista della spesa che i vari clienti devono seguire //definizione delle probabilità necessarie per determinare la scelta della //lista della spesa prvuomo=lista1 + lista6 + lista7 + lista8; prvdonna=lista2 + lista9 + lista10 + lista11; prscarpe=lista3 + lista6 + lista8 + lista10 + lista11; //per quanto riguarda lo sport abbiamo assunto che se i clienti non scelgono //nessun altro reparto scelgono di acquistare articoli sportivi prgiacche= lista5 + lista7 + lista8 + lista9 + lista11; scelta = uniform(0.0, 1.0); if(scelta < prvuomo) { vuomo=1; //la mia lista della spesa comprende un vestito da uomo } if((vuomo==0) && (scelta < prvdonna)) { vdonna=1; //la lista della spesa comprende un vestido da donna } if(scelta < prgiacche) { giacche=1; //devo comprare anche una giacca } 37 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco if(scelta < prscarpe) { scarpe=1; } if((vuomo==0) && (vdonna==0) && (giacche==0) &&(scarpe==0)) { sport=1; } //Gestione dei tempi di servizio dei vari reparti //il cliente si riserva un servitore per tutto il tempo della sua spesa //lo rilascerà solamente quando ha terminato la lista della spesa reserve(reparto); record(clock-ti, incoda); //il cliente visita tutti i vari reparti //Reparto VESTITI UOMO if(vuomo==1) { if(uniform(0.0, 1.0)<=0.9) temposerv=uniform(15.0, 25); //vestito disponibile else {do temposerv=normal(25.0, 2.0); //media, varianza while(temposerv<0);} hold(temposerv); //il cliente si ferma per la durata del tempo di servizio } //Reparto VESTITI DONNA if(vdonna==1) { if(uniform(0.0, 1.0)<=0.9) temposerv=uniform(35.0, 40.0); else {do temposerv=normal(42.0, 3.5); while(temposerv<0);} hold(temposerv); } //Reparto GIACCHE if(giacche==1) { if(uniform(0.0, 1.0)<=0.9) temposerv=uniform(10.0, 15.0); else {do temposerv=normal(17.0, 1.0); while(temposerv<0);} hold(temposerv); } //Reparto GIACCHE if(scarpe==1) { if(uniform(0.0, 1.0)<=0.9) temposerv=uniform(10.0, 15.0); else {do temposerv=normal(18.0, 1.5); while(temposerv<0);} 38 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco hold(temposerv); } //Reparto ABBIGLIAMENTO SPORTIVO if(sport==1) { if(uniform(0.0, 1.0)<=0.9) temposerv=uniform(5.0, 10.0); else {do temposerv=normal(16.0, 1.0); while(temposerv<0);} hold(temposerv); } //Il cliente ha terminato di fare la spesa e rilascia il commesso-servente release(reparto); //Introduciamo il ritardo delta che simula il tempo trascorso dai clienti //alla cassa per effettuare il pagamento della merce acquistata record(clock-ti, waitTime); if(uniform(0.0, 1.0)<=p1) { do temposerv=normal(3.0, 0.5); //ritardo delta introdotto dalla cassa while(temposerv<0); hold(temposerv); //il cliente effettua il pagamento } //i clienti che non hanno effettuato acquisti (con prob. 1-p1) vanno //direttamente all'uscita //in questa simulazione vengono considerati anche il transitorio iniziale //ed il transitorio finale //calcolo del tempo trascorso dal cliente nel negozio e sua registrazione record(clock-ti, inmagaz); cli--; //se il magazzino è stato chiuso e non ci sono più clienti al suo interno //allora termina la funzione di generazione dei clienti if(aperto==0 && cli==0) set(magazzinovuotomattina); } 7. PROGETTO DEGLI ESPERIMENTI 7.1Modelli alternativi Come alternativa al magazzino a coda multipla si è deciso di valutare un modello a coda unica, cioè un modello in cui i commessi servono i singoli clienti accompagandoli per tutto il negozio. I clienti, quindi, per ottenere i servizi di un commesso si devono tutti accodare in un'unica coda. Al fine di ottenere un'analisi coerente con il modello a code multiple si è scelto anche in questo caso di semplificare la parte riguardante le casse. 39 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco Nel simulatore è stata utilizzata una multiserver facility rappresentante tutti i commessi del magazzino. La politica di gestione è di tipo FCFS; per quanto riguarda i tempi di servizio dei commessi, essi sono stati modellati con due distribuzioni a seconda che l'articolo chiesto sia presente o meno nel reparto. Si considera quindi che nel 90% dei casi (articolo presente) il tempo di servizio sia modellato da una distribuzione di valori che variano da reparto a reparto e che sono qui riportati: Reparto vestiti uomo 15 min. - 25 min. Reparto vestiti donna 35 min. - 40 min. Reparto calzature 10 min. - 15 min. Reparto giacche 10 min. - 15 min. Reparto articoli sportivi 5 min. - 10 min. Per il rimanente 10% dei casi (articono non presente nel reparto) si utilizza una distribuzione gaussiana con valor medio e deviazione standard pari a: REPARTO MEDIA α DEVIAZIONE STANDARD σ Reparto vestiti uomo 25 min. 2 Reparto vestiti donna 42 min. 3,5 Reparto calzature 17 min. 1 40 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco REPARTO MEDIA α DEVIAZIONE STANDARD σ Reparto giacche 18 min. 1,5 Reparto articoli sportivi 16 min. 1 I tempi di accodamento ad un reparto dipendono dai tempi di servizio dei commessi del reparto stesso. Per quanto riguarda le casse, secondo le assunzioni considerante esse introducono solamente un ritardo ? pari ad una distribuzione gaussiana con valor medio pari a 3 min. e deviazione standard pari a 1. 7.2Parametri di prestazioni L'analisi degli obiettivi ha richiesto l'esecuzione di più run la cui durata è determinata dal tempo di attività del sistema reale (quattro ore). In entrambi i casi il parametro di prestazione su cui si è basata la scelta della soluzione migliore è stato il tempo medio trascorso in coda dai singoli clienti. Per quanto riguarda il primo obiettivo, si è considerata costante la distribuzione delle varie liste della spesa presentata nel capitolo 4 e si è variato, invece, il workload determinato dal numero di clienti che entrano nel magazzino: TEMPO DI INTERARRIVO CLIENTI/ORA 1 min. 60 1,5 min. 40 2 min. 30 2,5 min. 24 3 min. 20 3,5 min. 17 4 min. 15 4,5 min. 13 5 min. 12 5,5 min. 11 6 min. 10 6,5 min. 9 Determinato il modello ottimale, si considera costante un tempo di interarrivo pari a 2,5 min. e si va a variare il numero di commessi presenti nel negozio e la loro distribuzione nei vari reparti. Questo metodo operativo è stato utilizzato sia per il secondo che per il terzo obiettivo. 41 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco 8. ANALISI STATISTICA DEI RISULTATI L'analisi dell'output è stata effettuata, per entrambi gli obiettivi, utilizzando il metodo delle prove ripetute. Per ogni prova è stata calcolata la media campionaria complessiva e la rispettiva varianza campionaria dei tempi trascorsi in coda dai clienti (escludendo quindi il tempo impiegato per gli acquisti e quello impiegato per il pagamento). Si è fissato il confidence level ad un valore pari al 90% ottenendo pertanto un valore di α pari a 0.1. Tali valori, insieme al numero di gradi di libertà, hanno permesso di determinare sulla tavola della distribuzione “Student-t” il corrispondente valore del parametro da inserire nelle formule per il calcolo dell'intervallo di confidenza. Al fine di ridurre l'ampiezza di tale intervallo si è calcolato il numero di run necessari stabilendo un errore accettabile “e” tra la media teorica µ e la stima χ(n) (n) pari al 10 %. 8.1Magazzino a coda multipla vs Magazzino a coda singola Inizialmente si è scelto di considerare una simulazione costituita da 10 run, 9 gradi di libertà, α pari a 0,1; ciò implica che 1-α/2=0,95 con t=1,833. Questi valori hanno portato, per quanto riguarda il magazzino a coda unica, ad un intervallo di confidenza pari a: 1,4945320 <µ<2,8780159316 mentre, per il magazzino a coda multipla, ad un intervallo di confidenza pari a: 7,1404306 <µ<15,893243357 I due intervalli di confidenza non si sovrappongono, quindi il numero di run scelto sarebbe sufficiente. Di seguito sono riportati i dati dettagliati che hanno permesso di ottenere gli estremi dell'intervallo di confidenza: Magazzino coda unica Magazzino coda multipla Media campionaria 2.186274 11.516837 Varianza campionaria 4.785069 191.529326 Intervallo di confidenza 1,4945320 <µ<2,8780159316 7,1404306 <µ<15,893243357 Per ottenere maggiori campioni su cui effettuare le considerazioni si è deciso di considerare un numero maggiore di run, per la precisione 51 run (50 gradi di libertà). 9. ANALISI DEI RISULTATI 9.2 Obiettivo 1 Valutiamo la risposta dei due modelli variando il workload attraverso diversi valori del tempo di interarrivo dei clienti: 42 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco Obiettivo 1 140.00000000 130.00000000 120.00000000 Tempo trascorso in coda (min.) 110.00000000 100.00000000 90.00000000 80.00000000 70.00000000 60.00000000 50.00000000 40.00000000 30.00000000 20.00000000 10.00000000 0.00000000 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 Interarrivo dei clienti (min.) Tempo di interarrivo N° clienti/ora Magaz. Coda Unica Magaz. Coda Multipla 1 60 131.15446400 82.13497400 1,5 40 51.30000000 82.13497400 2 30 13.69773100 17.07937100 2,5 24 3.92980900 17.07937100 3 20 1.26553600 8.03311700 3,5 17 0.51974800 8.03311700 4 15 0.16817300 6.65368600 4,5 13 0.10693700 6.65368600 5 12 0.03784700 5.49436600 5,5 11 0.00760100 5.49436600 6 10 0.01465100 5.81349700 6,5 9 0.00258500 5.81349700 La linea blu indica il modello a coda unica mentre la linea rosa quello a code multiple. Dal grafico 43 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco si vede che l'ipotesi ottimale è quella descritta dal modello a coda unica: infatti, se si esclude la zona racchiusa tra 1 min. e 1,3 min. (zona di saturazione dei modelli), il grafico del modello a coda unica è sempre al di sotto di quello a coda multipla, inoltre quest'ultimo tende ad assestarsi ad un valore del tempo di attesa dei clienti che sembra essere costante e non abbassarsi nonostante il sempre minor numero di clienti che affluiscono al magazzino. Considerando solamente il modello a coda unica andiamo ora a determinare il punto di lavoro considerando il tempo necessario per smaltire i clienti ancora presenti nel magazzino dopo la chiusura. Punto di lavoro 350.00000000 Tempo di apertura straordinaria 300.00000000 250.00000000 200.00000000 150.00000000 100.00000000 50.00000000 0.00000000 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 Tempo di interarrivo clienti (min.) Tempo di interarrivo N° clienti/ora Tempo extra trascorso in magazzino 1 60 332.90172000 1,5 40 163.25441100 2 30 84.59032000 2,5 24 58.24747600 3 20 50.61977100 3,5 17 50.22668600 4 15 48.61927300 4,5 13 42.61898800 5 12 42.61870500 44 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco Tempo di interarrivo N° clienti/ora Tempo extra trascorso in magazzino 5,5 11 42.70237600 6 10 39.68149500 6,5 9 40.62948200 Già con 30 clienti/ora (tempo di interarrivo 2 min.) si riscontra che il magazzino rimane aperto per circa 85 minuti oltre il tempo di chiusura; si è pertanto ritenuto ragionevole scegliere un tempo di interarrivo pari a 2,5 min. (24 clienti/ora) determinando così una chiusura ritardata di circa 58 minuti. Considerando questo punto di lavoro, se andiamo a rivedere il punto precedente di questo capitolo è ancora più marcata la differenza tra i due modelli e la convenienza del modello a coda unica. 9.2 Obiettivo 2 Presentiamo innanzitutto il codice del modello che è stato modificato per tener conto sia dell'aspetto economico, sia della necessità di tener traccia del tempo di apertura straordinaria del magazzino. Codice del programma Prima di presentare i risultati ottenuti bisogna segnalare il fatto che il numero di run considerato in questa simulazione è 8 (cioè quattro giornate lavorative complete) poiché si è considerato il limitato periodo di tempo che intercorre durante il periodo natalizio dove si è riscontrato il maggior afflusso di clienti al magazzino. Qui di seguito sono riportati i dati relativi alla situazione di partenza ed alla situazione che si vorrebbe ottenere alla fine delle simulazioni: Interarrivo iniziale Apertura straordinaria iniziale Apertura straordinaria finale 1,5 163.25441100 58.24747600 L'unico parametro che si può variare per raggiungere tale obiettivo è il numero di commessi destinati a servire i clienti. Di seguito sono riportati i dati dettagliati relativi alle medie calcolate durante le prove ed i relativi guadagni ottenuti dalla vendita degli articoli del magazzino: N° di commessi Apertura straordinaria Guadagni lordi Costi sostenuti Guadagni netti 10 167.016305 € 22258.07 € 2600.00 19658.07 11 119.525443 € 20898.02 € 2660.00 18238.02 12 111.499383 € 21459.39 € 2720.00 18739.39 13 100.305735 € 22784.44 € 2780.00 20004.44 14 65.979568 € 20260.25 € 2840.00 17420.25 15 66.223157 € 22533.36 € 2900.00 19633.36 45 Tesina di Impianti di Elaborazione – A.A. 2001/2002 – Ansaloni Mauro, Antonioni Sanzio, Panarelli Francesco N° di commessi Apertura straordinaria Guadagni lordi Costi sostenuti Guadagni netti 16 59.36647 € 21141.77 € 2960.00 18181.77 17 56.473732 € 20749.08 € 3020.00 17729.08 Effettuando considerazioni puramente temporali otteniamo come soluzione ottima quella che prevede 17 commessi. Considerando unicamente il parametro economico, considerando anche le assunzioni fatte in precedenza (vedi cap.2), si vede che l'unica soluzione accettabile risulta essere quella che prevede 13 commessi. Volendo infine effettuare un'analisi completa che prenda in considerazione sia l'aspetto temporale che quello economico, si nota che una soluzione accettabile risulta essere quella che prevede 15 commessi. 46