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