Esame di Stato 2008-2009 Bianco Riccardo – 5A Informatica (realizzata in gruppo con Colosimo Paolo) La teoria delle code La distribuzione di Poisson applicata al problema delle file di attesa e le possibili soluzioni Tesina Tesina Indice Introduzione Teoria Breve biografia di Poisson La variabile casuale poissoniana Il processo di Poisson Variabile aleatoria del numero di arrivi Variabile aleatoria del numero di serviti Il programma creato Analisi di un sistema M/M/1 (1 fila d’attesa – 1 stazione di servizio) Risoluzione dell’esercizio proposto Analisi dei risultati Resoconto testuale Analisi di un sistema M/M/m (1 fila d’attesa – k stazioni di servizio) Risoluzione dell’esercizio proposto Analisi dei risultati Resoconto testuale Conclusioni generali Strumenti utilizzati Bibliografia 2 2 3 4 4 4 7 8 9 13 14 15 16 20 21 23 24 24 24 Pagina 1 Introduzione: Quanti di noi non si sono trovati almeno una volta nella vita in coda? In autostrada, al supermercato, all’ufficio postale o in attesa a un call-center: l’elenco di situazioni in cui “perdiamo” tempo ad attendere è potenzialmente infinito. Il comportamento che mostriamo in coda assume diverse sfumature: c’è chi attende tranquillamente il proprio turno, c’è chi comincia a inveire verso gli impiegati dello sportello, spesso supportato dalle altre persone in coda, lamentando una scarsa efficienza del servizio e c’è chi, avendone la possibilità, cambia la sua fila d’attesa, così come tentò a suo tempo un automobilista in uno spot pubblicitario del 2000. Purtroppo, il cambio di corsia non ebbe l’effetto sperato. L’obiettivo di questa tesina è di dimostrare che le code non sono regolate dalle leggi di Murphy (“La fila accanto è sempre più veloce”), ma da leggi matematiche ben precise nelle quali trova larga applicazione la distribuzione di Poisson. Teoria: Come si è già detto, la formazione delle code, e quindi il relativo problema di code si presenta sovente nella vita di tutti i giorni. Di solito, l’obiettivo di chi fornisce un servizio è di renderlo più efficiente possibile, per evitare possibili lamentele che potrebbero portare alla perdita del cliente. Non sempre l’ampliamento del servizio risolve i problemi: si pensi a un’autostrada con 7 caselli. Dopo continue richieste da parte degli automobilisti, vengono aggiunti altri 5 caselli. Se i caselli aggiunti rimangono però inutilizzati per la maggior parte del tempo, le spese per il sostentamento delle strutture aggiunte ricadrebbero sull’utente finale. Sorge dunque il problema di fornire all’utente un servizio con tempi di attesa accettabili: per questi motivi è necessario uno studio meticoloso: sull’arrivo delle persone alla stazione di servizio sulla fruizione del servizio sulla partenza delle persone dalla stazione, dopo aver fruito il servizio In realtà, una coda non si riduce a tre fattori. Si può sapere a priori in che momenti della giornata arriva una persona per richiedere un servizio? Si sa qual è il tempo medio per servire un utente? Si sa se ogni cliente è disponibile ad attendere o rinuncia al servizio, provocando un mancato guadagno o peggio ancora la perdita di tale cliente? Si sa sempre per quanto tempo il gestore resta nullafacente, in attesa di un cliente da servire? Si conosce a fondo la portata del sistema? La prima ricerca sulla teoria delle code è opera dell’ingegnere danese A.K. Erlang, che, nei primi decenni del XX secolo studiò la congestione del traffico telefonico in una centrale telefonica non automatica con N addetti. Egli introdusse dunque una distribuzione di probabilità (che da lui prese il nome): solo dopo la Seconda Guerra Mondiale, con lo sviluppo della ricerca operativa, si sono avute applicazioni dei lavori di Erlang anche in ambiti molto diversi da quello degli impianti telefonici. Va aggiunto, inoltre, che mentre Pagina 2 nella maggior parte di problemi di R.O. si cerca di ottimizzare una funzione economica, la teoria delle file d’attesa è volta soprattutto alla descrizione del fenomeno. Per effettuare lo studio servono dunque diversi parametri. Uno su tutti, l’organizzazione della stazione di servizio. Tipo di Caratteristiche Rappresentazione schematica coda * M/M/1 E’ formata da una sola fila d’attesa e una sola stazione di servizio. Vale il principio del “prima arrivi, prima vieni servito”. Esempio: un ambulatorio medico M/M/m E’ formata da una sola fila d’attesa, ma viene gestita con n stazioni di servizio. Anche in questo caso vale il principio del “prima arrivi, prima vieni servito”. Esempio: un negozio con più commessi E’ formata da n file d’attesa, ciascuna delle quali servita da una stazione. Non vale più il principio del “prima arrivi, prima vieni servito”, o meglio, non vale più globalmente, ma solo nell’ambito di ogni singola fila. Esempio: un supermercato * La notazione usata è stata inventata da David George Kendall: A/B/c/d/e-x A: processo stocastico degli arrivi (con M si indicano gli arrivi di tipo markoviano, secondo un processo di Poisson) B: processo stocastico dei tempi di servizio (con M si indica una densità di probabilità esponenziale) c: numero di serventi d: (facoltativo) Capacità massima della coda (esclusa la capacità del sistema di servizio), se non indicata pari a∞ e: (facoltativo) Dimensione della popolazione (ovvero, il numero possibile dei clienti del sistema a coda), se non indicato pari a ∞ x: (facoltativo) Metodo di gestione della coda, se non indicato è FIFO (“il primo arrivato è il primo servito”) Ma la domanda di fondo è: perché trova larga applicazione la distribuzione di Poisson? Prima di rispondere a questa domanda, verrà presentato qualche cenno biografico relativo alla vita del matematico francese. Breve biografia di Poisson Simeon Denis Poisson nasce nel 1781 e muore nel 1840. Oltre ad essere un matematico, si è occupato anche di fisica, astronomia e probabilità. Tra le altre cose, si ricorda l’applicazione della matematica all’elettricità e al magnetismo. Inoltre, contribuì allo sviluppo dell’attuale statistica (si occupò di quest’argomento poco prima della sua morte) introducendo (durante una ricerca sulle statistiche giudiziarie) la distribuzione di Poisson, limite della distribuzione di Pascal e della distribuzione binomiale. Pagina 3 La variabile casuale poissoniana La variabile casuale poissoniana è definita con la funzione di probabilità 𝝀𝒙 𝑷 𝒙 = (𝒆 ) 𝒏! −𝝀 λ è un qualsiasi valore positivo (λ > 0) equivalente al numero di successi che ci si aspetta che si verifichino in un dato intervallo di tempo. x è il numero delle occorrenze per cui si vuole prevedere la probabilità (x ≥ 0) La poissoniana è detta legge degli eventi rari, in quanto può essere applicata al posto della variabile casuale binomiale B(p;n) quando la probabilità p di un evento è molto bassa e contemporaneamente la grandezza del campione n è molto alta, ovvero quando un evento è raro, ma il numero di eventi che si verificano (λ = np) è comunque finito. Il processo di Poisson Il processo di Poisson è un processo puramente casuale di arrivi che soddisfano le seguenti ipotesi: 1. non vi sono mai arrivi simultanei 2. gli arrivi sono eventi indipendenti (dal punto di vista del calcolo delle probabilità) 3. la probabilità pn(t) che in un intervallo di tempo t si abbiano esattamente n arrivi dipende solo da n e dalla durata di t e non dalla posizione dell’intervallo nell’arco del tempo (condizione di stazionarietà) 4. la probabilità che in un intervallo di tempo ∆t “sufficientemente piccolo” si abbia un solo arrivo è direttamente proporzionale: dunque, la probabilità che nell’intervallo ∆t si abbiano due o più arrivi è trascurabile Per analizzare il processo degli arrivi secondo le precedenti quattro ipotesi si introducono due variabili aleatorie: 1. il numero di arrivi in un tempo t 2. la durata dell’intervallo di tempo fra due arrivi successivi Variabile aleatoria del numero di arrivi La variabile aleatoria del numero di arrivi si indica con 𝑁(𝑡). Questa variabile corrisponde al numero degli arrivi nell’intervallo di tempo ]0; 𝑡[. Si può scegliere anche un intervallo di tempo ]𝑡0 ; 𝑡0 + 𝑡[, così come suggerisce la terza ipotesi di Poisson. Ad ogni valore di n = 0, 1, 2, 3 … si deve associare la rispettiva probabilità pn(t), ovvero la probabilità che nel tempo t arrivino nel sistema esattamente n unità. In primo luogo, si considera il caso n = 0 e si calcola la probabilità che non vi siano arrivi. In un intervallo t “sufficientemente piccolo” si può verificare al massimo un arrivo (quarta ipotesi). Inoltre, per la proprietà di distribuzione di probabilità delle variabili casuali Pagina 4 𝑖= ∞ 𝑖= ∞ 𝑝𝑖 = 1 𝑒 𝑞𝑢𝑖𝑛𝑑𝑖 𝑝𝑖 Δ𝑡 = 1 𝑖=0 𝑖=0 Per la quarta ipotesi, si ha: 𝑝0 Δ𝑡 = 1 − 𝜆Δ𝑡 − 𝑜(Δ𝑡) Considerando ora l’intervallo ]𝑡; 𝑡 + Δ𝑡] in cui la probabilità p0(t + ∆t) è composta dai due eventi 𝐸′0 : nell’intervallo di tempo ]0; t] non si hanno arrivi 𝐸′′0 : nell’intervallo ]t; t + ∆t] non si hanno arrivi per l’indipendenza degli eventi si può scrivere che: 𝑝0 t + Δ𝑡 = 𝑝0 𝑡 ∗ 𝑝0 Δ𝑡 Sostituendo nell’eguaglianza il valore di 𝑝0 Δ𝑡 che si ottiene nella formula precedente si ricava la relazione: 𝑝0 t + Δ𝑡 = 𝑝0 𝑡 ∗ [1 − 𝜆Δ𝑡 − 𝑜 Δ𝑡 ] Effettuando le opportune semplificazioni e passando al limite si ha: 𝑝′0 𝑡 = −𝜆 ∗ 𝑝0 𝑡 Risolvendo l’equazione differenziale a variabili separabili (tenendo conto che per t = 0, p0(0) = 1) si ricava: 𝒑𝟎 𝒕 = 𝒆−𝝀𝒕 Questa relazione esprime la probabilità che nell’intervallo di tempo +0; t+ nel sistema vi siano 0 arrivi. In modo analogo si ricavano le relative equazioni differenziali per n≥1, il cui sistema è risolto da: 𝒑𝒏 𝒕 = 𝝀𝒕 𝒏 (𝒆−𝝀𝒕 ) 𝒏! Si può dunque concludere che N(t) ha una distribuzione di Poisson di parametro 𝜆𝑡. Per avere un paragone dell’importanza di questa distribuzione, si pensi al ruolo che gioca la distribuzione normale nella teoria del campionamento. La funzione che esprime la probabilità che nel sistema vi siano n arrivi è funzione sia di n che di t. Fissato t, pn(t) risulta funzione di n. Poiché n è un numero naturale, la funzione è una successione e si rappresenta con punti sul piano cartesiano. Pagina 5 In questo studio, però, risulta di maggior interesse fissare n, e rappresentare la pn(t) per alcuni valori di n. Si pone dunque λt = x, e si ha la funzione (𝒆−𝒙 ) 𝒇 𝒏 𝒙 = 𝒙𝒏 𝒏! Fissando n = 0, 1, 2, 3 si ottiene questo grafico. Con n piccolo le curve sono asimmetriche, mentre all’aumentare di n tendono a diventare simmetriche. Ricordando che il valore medio di una variabile distribuita secondo Poisson è il parametro stesso, si ricava che 𝑴𝑵 𝒕 = 𝝀𝒕 che equivale a dire: il numero medio di arrivi è λt. Pagina 6 Se poi si fissa t = 1 (unità di tempo), risulta che M*N(1)+ = λ, ragion per cui si può concludere che: ′ 𝝀 = 𝒏𝒖𝒎𝒆𝒓𝒐 𝒅𝒊 𝒂𝒓𝒓𝒊𝒗𝒊 𝒏𝒆𝒍𝒍 𝒖𝒏𝒊𝒕à 𝒅𝒊 𝒕𝒆𝒎𝒑𝒐 (1/ λ rappresenta il tempo medio fra due arrivi) Variabile aleatoria del numero di serviti L’altra variabile aleatoria considerata nella teoria delle code è 𝑇, ovvero la durata dell’intervallo fra due arrivi consecutivi. Per chiarire meglio il concetto, ecco una rappresentazione degli arrivi su un asse temporale, partendo da t = 0. 0 t1 t2 t3 … Supponiamo di far partire la nostra rilevazione in un negozio alle 16:21. Alle 16:25 arriva il primo cliente, alle 16:31 il secondo, alle 16:40 il terzo, alle 16:56 il quarto e così via. Questi intervalli di tempo fra due arrivi successivi sono alcuni dei valori della variabile aleatoria T. La probabilità che la durata dell’intervallo di tempo fra due arrivi consecutivi sia t si calcola tenendo conto che: 1. la funzione di ripartizione f(t) = P(T≤t) è la probabilità che l’intervallo di tempo fra due arrivi successivi sia non maggiore di un certo valore t (>0). 2. se vi sono due arrivi successivi in un tempo ≤ t, vi è almeno un arrivo nell’intervallo di tempo t. Dunque, la probabilità espressa al punto 1 è uguale alla probabilità che vi sia almeno un arrivo nell’intervallo di durata t. Si può quindi scrivere che: 𝑛 =∞ 𝑝𝑛 𝑡 = 1 − 𝑝0 𝑡 = 1 − 𝑒 −𝜆𝑡 𝐹 𝑡 = 𝑃 𝑇≤𝑡 = 𝑃 𝑁 𝑡 >0 = 𝑛=1 Siccome nelle distribuzioni continue di probabilità la funzione di densità è la derivata della funzione di ripartizione, allora si può scrivere che: 𝒇 𝒕 = 𝝀𝒆−𝝀𝒕 Pagina 7 Per t>0, la funzione decresce al crescere di t, quindi la probabilità di avere tempi lunghi fra due arrivi è molto piccola. Di contro, è più probabile che fra due arrivi consecutivi ci sia un breve intervallo di tempo. Il valore medio di questa distribuzione coincide con 1/ λ, che, come già detto, rappresenta il tempo medio fra due arrivi. Per chiarire questo concetto, facciamo un esempio. In un negozio di informatica giungono in media 50 persone ogni 25 minuti. Tenendo conto che la distribuzione è poissoniana, calcolare la probabilità che fra due arrivi successivi ci sia un intervallo non superiore a 6 minuti. λ = 50 persone / 25 minuti = 2 persone al minuto Dalla funzione di ripartizione 𝑭 𝒕 = 𝟏 − 𝒆−𝝀𝒕 si ricava che: 𝑭 𝟓 = 1 − 𝑒 −12 = 𝟎, 𝟗𝟗𝟗𝟗𝟗𝟑𝟖𝟓𝟓 Si è dunque quasi certi che una persona entrerà 5 minuti dopo l’ingresso della precedente. Per lo studio dei tempi di servizio si può fare un ragionamento simile al precedente, supponendo che le durate del servizio siano casuali e soddisfino alle condizioni indicate per gli arrivi. Infatti, la probabilità che un servizio venga effettuato in un ∆t sufficientemente piccolo è pari a µ∆t, con ′ 𝝁 = 𝒏𝒖𝒎𝒆𝒓𝒐 𝒅𝒊 𝒔𝒆𝒓𝒗𝒊𝒕𝒊 𝒏𝒆𝒍𝒍 𝒖𝒏𝒊𝒕à 𝒅𝒊 𝒕𝒆𝒎𝒑𝒐 (1/µ rappresenta la durata media del servizio) Inoltre, la variabile aleatoria “durata di un servizio” è analoga alla variabile aleatoria “durata dell’intervallo fra due arrivi successivi”. Ragionando come già fatto in precedenza, si può scrivere che: −𝝁𝒕 𝒈 𝒕 = 𝝁𝒆 Il programma creato Durante il corso di laboratorio di calcolo è stato creato un programma che permette la risoluzione di semplici sistemi di code M/M/1 e M/M/m. Logo del programma L’interfaccia grafica è semplice e consente, una volta scelto il tipo di coda, l’immissione di scelte e dati unicamente numerici (viene infatti effettuato un controllo sui dati immessi da tastiera). Pagina 8 Dopo aver inserito i dati necessari (ed eventualmente i dati relativi al calcolo delle probabilità) il programma mostra una schermata con i risultati e permette di effettuare una nuova simulazione, oppure di esportare un file sul Desktop che contiene il resoconto dettagliato in formato .txt del sistema di coda simulato. Con il programma creato, è stato possibile risolvere velocemente due sistemi di coda tra i tanti presenti sui testi di riferimento. Di seguito verranno riportati due esempi, corredati da una breve spiegazione teorica: il primo relativo a una coda con una fila d’attesa e una sola stazione di servizio, il secondo con una fila d’attesa e n stazioni di servizio. Analisi di un sistema M/M/1 (1 fila d’attesa – 1 stazione di servizio) Il sistema di coda M/M/1 è caratterizzato da una sola stazione di servizio, che si occupa di soddisfare le richieste delle unità nell’unica fila d’attesa che si forma. Indicando con: λ il numero medio di arrivi nell’unità di tempo µ il numero medio di utenti serviti nell’unita di tempo il rapporto fra questi due parametri assume una grande importanza nell’analisi dei sistemi M/M/1: prende il nome di intensità del traffico o fattore di utilizzazione, e indica il numero medio di unità sotto servizio. Importante sottolineare che tale rapporto sia minore di 1, altrimenti la fila d’attesa diventerebbe illimitata. 𝜌= 𝜆 𝜇 Di seguito, si riporta la traccia di un tipico esercizio. A un ufficio di pratiche automobilistiche arrivano, nelle 6 ore di apertura, 48 clienti. Il gestore ha effettuato uno studio sulla produttività, stabilendo che il numero medio di utenti serviti in un’ora è 13. Calcolare: 1. la probabilità che un cliente debba attendere in coda 2. il numero medio di utenti presenti nel sistema 3. il numero medio di utenti presenti in coda 4. il tempo medio di attesa in coda 5. il tempo medio di attesa nel servizio 6. il tempo medio di attesa nel sistema 7. la probabilità che in coda siano presenti: a. esattamente 0 persone (quindi la probabilità di trovare lo sportello libero) b. almeno 3 persone c. non più di 4 persone 8. la probabilità di dover attendere più di 15 minuti prima di essere serviti Probabilità di attendere La probabilità che un utente entrato nell’ufficio ha di attendere equivale al fattore di utilizzazione, precedentemente citato. 𝜆 𝜌= 𝜇 Pagina 9 CODICE Function rho(ByVal lambda As Double, ByVal mu As Double) As Double rho = lambda / mu End Function Numero medio di unità presenti nel sistema Il numero medio di unità presenti nel sistema equivale al numero di persone che l’utente troverà in coda, inclusa la persona che attualmente è sotto servizio. Per effettuare il calcolo, si usa la seguente formula: 𝐸 𝑛 = 𝜌 1− 𝜌 CODICE Function unitaTot(ByVal rho As Double) As Double unitaTot = rho / (1 - rho) End Function Spesso risulta però più interessante sapere il… Numero medio di unità presenti in coda Grazie a questa formula 𝐸 𝑚 = 𝜌 − 𝜌 1− 𝜌 (dove m = n – 1, in quanto non viene considerata l’unità sotto servizio) si è invece in grado di sapere il numero medio di persone che l’utente troverà in coda, senza includere l’utente che viene servito. CODICE Function unitaTot(ByVal rho As Double) As Double unitaTot = rho / (1 - rho) End Function Tempo medio di attesa in coda Quanto tempo dovrà aspettare l’utente prima di essere servito? A questa domanda, risponde la formula 𝜌2 𝜆 𝑤𝑓 = = 𝜆(1 − 𝜌) 𝜇(𝜇 − 𝜆) grazie alla quale si può trovare il tempo di attesa in coda di un unità. Va detto che i due tempi (utenti arrivati e utenti serviti) devono essere basati sulla stessa unità di misura (nel programma prodotto è stato scelto il minuto). CODICE Function tCoda(ByVal lambda As Double, ByVal mu As Double) As String tCoda = (lambda / (mu * (mu - lambda))) tCoda = Orologio(tCoda) End Function Pagina 10 Nota: è stata introdotta la funzione Orologio, per convertire un tempo in scala decimale (es: 14,5 minuti) in scala sessagesimale (es: 14 minuti e 30 secondi) Tempo medio di attesa nel servizio Come già accennato nella parte teorica, se µ è pari al numero di serviti nell’unità di tempo, il suo reciproco 1 𝜇 indica la durata media del servizio, e quindi il tempo in cui l’unità viene servita. CODICE Function tServente(ByVal mu As Double) As String tServente = (1 / mu) tServente = Orologio(tServente) End Function Tempo medio di attesa nel sistema Logicamente, il tempo medio di attesa nel sistema può essere calcolato come la somma fra il tempo speso in coda e il tempo speso nel servizio. Anche questo calcolo è tuttavia regolato da una formula 1 𝑤= 𝜇− 𝜆 che restituisce il tempo medio di attesa nel sistema, senza prima dover calcolare i due tempi medi (di attesa in coda e nel servizio). Va detto che (ovviamente) i due risultati coincidono. CODICE Function tSistema(ByVal lambda As Double, ByVal mu As Double) As String tSistema = 1 / (mu - lambda) tSistema = Orologio(tSistema) End Function Calcolo delle probabilità di presenza di n unità nel sistema Il calcolo delle probabilità relativo alla presenza di n unità nel sistema varia a seconda dei parametri impostati. Si suppone, ad esempio di considerare la presenza di 10 unità nel sistema: prima di effettuare calcoli, bisogna sapere se sono esattamente 10 unità, almeno 10 unità o non più di 10 unità. Probabilità che nel sistema vi siano esattamente n unità 𝜆 𝑛 𝜆 𝑃𝑛 = 1− 𝜇 𝜇 Probabilità che nel sistema vi siano almeno n unità 𝑃 𝑛 ≥ 𝑁 = 1 − (𝑃0 + 𝑃1 + … + 𝑃𝑁 ) Probabilità che nel sistema vi siano non più di n unità 𝑃 𝑛 ≤ 𝑁 = 𝑃0 + 𝑃1 + 𝑃2 + 𝑃3 + 𝑃4 + … + 𝑃𝑁 Pagina 11 Sviluppando la formula, si ottiene una progressione geometrica, la cui somma è pari a: 𝑃 𝑛 ≤ 𝑁 = 1 + 𝜌𝑁+1 Nell’implementazione dell’algoritmo si è tenuto conto anche di un caso particolare: se si sceglie la probabilità di trovare almeno 0 persone in coda, in pratica ci si sta chiedendo qual è la probabilità di dover attendere, che come già visto corrisponde al rapporto fra il numero di arrivi e il numero di serviti. CODICE Function probPresenza(ByVal rho As Double, ByVal N As Integer, ByVal tipo As String) As Double If N = 0 And ((tipo = "esattamente") Or (tipo = "non più di")) Then probPresenza = 1 - rho Exit Function End If If N = 0 And tipo = "almeno" Then probPresenza = rho Exit Function End If If tipo = "esattamente" Then probPresenza = ((rho ^ N) * (1 - rho)) Exit Function End If If tipo = "almeno" Then i = 0 Pi = 0 While i < N Pi = Pi + ((rho ^ i) * (1 - rho)) i = i + 1 Wend probPresenza = 1 - Pi Exit Function End If If tipo = "non più di" Then probPresenza = 1 - (rho ^ (N + 1)) Exit Function End If End Function Probabilità di dover attendere più di w minuti Questa probabilità si ricava dalla variabile aleatoria W (tempo di attesa nel sistema), da cui si ricavano anche il tempo medio di attesa nel sistema e il tempo medio di attesa nella fila. Corrisponde alla probabilità che un’unità arrivata nel sistema debba attendere più di un certo tempo w prima di essere servita. Si calcola con la formula: 𝑃 𝑤 > 𝑊 = 𝑒 − 𝜇 −𝜆 𝑤 Pagina 12 CODICE Function probAttesa(ByVal lambda As Double, ByVal mu As Double, ByVal w As Integer) probAttesa = Exp(-(mu - lambda) * w) End Function Risoluzione dell’esercizio proposto Apriamo il programma e selezioniamo il menu Coda M/M/1. Il campo “Numero di stazioni di servizio” sarà ovviamente non modificabile, e impostato a 1. Procediamo all’inserimento dei dati. A inserimento concluso, facciamo click su Simula!. L’applicativo chiederà per mezzo di una finestra di dialogo se si desidera calcolare anche delle probabilità. Facciamo click su Sì e impostiamo i parametri. (per calcolare le altre probabilità effettueremo altre due simulazioni con gli stessi dati) Cliccando su OK il programma ci mostra una finestra con i risultati. Pagina 13 Altri risultati: A questo punto possiamo decidere di esportare i risultati sul Desktop, o effettuare una nuova simulazione. Esportiamo il file e analizziamo i risultati. Analisi dei risultati: Dal sistema di coda simulato, emerge che una persona ha circa il 61% di probabilità di dover fare la coda una volta entrato nell’ufficio di pratiche automobilistiche. La probabilità complementare (ovvero quella di trovare 0 unità in coda) è del 38,41%. Troverà dunque altre persone prima di lui: nel caso specifico, può ritenersi abbastanza fortunato, in quanto mediamente c’è circa una persona in coda e due nel sistema. Infatti, la probabilità di trovare almeno 3 unità in coda è bassa (23%) e, allo stesso tempo, è molto alta quella di trovare non più di 4 unità in coda (oltre il 90%). La persona entrata ha circa 1 probabilità su 3 di dover attendere più di 15 minuti. Dopo aver dunque atteso per 7 minuti e 23 secondi il suo turno, potrà essere servito. Arrivato allo sportello, impiegherà mediamente 4 minuti e 37 secondi per sbrigare la pratica e dopo 12 minuti dal suo ingresso potrà uscire dall’ufficio. Pagina 14 Resoconto testuale *********************************** ************ FAST QUEUE *********** *********************************** di Bianco Riccardo e Colosimo Paolo Data: 17/05/2009 Ora: 13.15.27 Dati della simulazione effettuata Tipo di coda ......................................... M/M/1 -----------------------------------------------------------Unità arrivate ....................................... 48 In un tempo di ....................................... 6 ore Unità servite ........................................ 13 In un tempo di ....................................... 1 ora -----------------------------------------------------------Tempi medi (mm:ss) Attesa in coda ....................................... 7:23 Attesa nel servizio .................................. 4:37 Attesa nel sistema ................................... 12:00 -----------------------------------------------------------Probabilità di Attendere ........................................ 0,615384615 Trovare non più di 4 unità in coda ............... 0,911746249 Attendere più di 15 minuti ....................... 0,286504797 -------------------------------------------------------------Numero medio di: Unità in coda .......................................... 0,985 Unità nel sistema ...................................... 1,6 -------------------------------------------------------------- Pagina 15 Analisi di un sistema M/M/m (1 fila d’attesa – k stazioni di servizio) Mentre nel sistema di coda M/M/1 veniva considerato un sistema con un’unica fila d’attesa e un unico posto di servizio, nel sistema M/M/m la fila d’attesa è sempre unica, ma ci sono k posti di servizio, che vengono definiti canali paralleli. Un esempio tipico di questo sistema di coda è il problema del parrucchiere con k commessi: il cliente verrà servito se ci sono posti liberi (quindi, se i clienti presenti n sono minori dei posti di servizio k) mentre dovrà “leggersi il giornale” se, a un certo istante t, i clienti presenti n sono maggiori dei posti di servizio k. In questo caso il rapporto 𝜌 𝜆 𝑐𝑜𝑛 𝜌 = 𝑘 𝜇 (con k = n° stazioni di servizio) deve valere meno di 1, altrimenti la fila d’attesa sarebbe illimitata. Di seguito, si riporta la traccia di un tipico esercizio. In un magazzino aperto al pubblico arrivano in media 120 clienti al giorno (la giornata lavorativa è di 8 ore). Ogni cliente può essere servito secondo l’ordine di arrivo (FIFO) da uno dei quattro commessi e la durata media del servizio è pari a 10 minuti. Supponendo che gli arrivi siano distribuiti secondo Poisson e che i tempi di servizio seguano una legge esponenziale, calcolare: 1. il tempo di attesa in coda 2. il tempo impiegato dal commesso per servire un cliente (in questo caso, 10 minuti) 3. il tempo di attesa nel sistema 4. la probabilità di dover attendere 5. la probabilità di trovare esattamente 3 clienti nel negozio 6. la probabilità di attendere 7 minuti 7. il numero medio di unità in coda e nel sistema 8. i canali mediamente non occupati e quanto tempo al giorno è perso in media dai commessi perché in attesa di clienti Probabilità di stato stazionario La probabilità di stato stazionario corrisponde alla probabilità che nel sistema di coda vi siano esattamente 0 persone. Questa probabilità è alla base di una buona parte dei calcoli che si effettuano per risolvere un sistema di coda M/M/m. Si calcola con la formula: 𝑃0 = 𝑛=𝑘−1 𝑥= 𝑛=0 1 𝑥 𝜌𝑛 𝜌𝑘 1 + ∗ 𝑛! 𝑘! 1 − 𝜌 𝑘 e consente poi di effettuare i calcoli relativi a ogni 𝑃𝑛 , al numero medio di unità nella fila d’attesa e alla probabilità che un’unità debba attendere. A loro volta, questi calcoli sono alla base del calcolo del numero medio di unità presenti nel sistema, dei vari tempi di attesa e della probabilità che un’unità debba attendere un tempo superiore a w. Pagina 16 CODICE Function statoStazionario(ByVal rho As Double, ByVal k As Integer) sommatoria = 0 i = 0 While i < k sommatoria = sommatoria + ((rho ^ i) / Fattoriale(i)) i = i + 1 Wend statoStazionario = 1 / (sommatoria + ((rho ^ k / Fattoriale(k)) * (1 / (1 - (rho / k))))) End Function Tempo di attesa in coda Per calcolare il tempo medio di attesa in coda si utilizza la relazione 𝜈 = 𝜆𝑤𝑓 . Quindi, si può scrivere che: 𝜈 𝑤𝑓 = 𝜆 CODICE Function tCodaM(ByVal lambda As Double, ByVal ni As Double) As Variant tCodaM = ni / lambda End Function * ni è il numero medio di unità nella fila d’attesa, che deve dunque essere già stato calcolato Tempo di attesa nel servizio Il tempo medio di attesa nel servizio è il tempo che occorre a chi serve il cliente per soddisfare le sue richieste. Nell’esercizio svolto, è chiaro dalla traccia che una persona verrà servita in 10 minuti. Nel caso in cui la traccia non esplicitasse il tempo di servizio per una singola persona, è possibile ricorrere alla formula 𝑡 = 𝑤 − 𝑤𝑓 ovvero, la differenza fra il tempo speso nel sistema e il tempo atteso in coda. Tempo di attesa nel sistema Il tempo medio di attesa nel sistema è il tempo impiegato da un cliente all’interno del magazzino. Si calcola con la seguente formula: 𝑛 𝑤= 𝜆 CODICE Function tSistemaM(ByVal lambda As Double, ByVal enne As Double) As Variant tSistemaM = enne / lambda End Function * enne è il valore medio di unità presenti nel sistema, che deve dunque essere già stato calcolato Probabilità di dover attendere Per trovare la probabilità che un’unità entrata nel sistema debba attendere prima di essere servita, riprendiamo il ragionamento fatto nell’introduzione. Se ci sono n persone e k stazioni di servizio: 𝑠𝑖 𝑎𝑡𝑡𝑒𝑛𝑑𝑒 𝑠𝑒 𝑛 > 𝑘 𝑛𝑜𝑛 𝑠𝑖 𝑎𝑡𝑡𝑒𝑛𝑑𝑒 𝑠𝑒 𝑛 ≤ 𝑘 Pagina 17 Fatte queste premesse, la probabilità che un’unità debba attendere equivale alla probabilità che nel sistema siano presenti tante unità quante sono i posti di servizio, che corrisponde a 𝑛= ∞ 𝑃 𝑁≥𝑘 = 𝑃𝑛 = 𝑛=𝑘 𝜌𝑘 1 ∗ ∗𝑃 𝑘! 1 − 𝜌 0 𝑘 CODICE Function pAttendereM(ByVal Po As Double, ByVal rho As Double, ByVal k As Integer) As Variant a = rho ^ k / Fattoriale(k) b = 1 / (1 - (rho / k)) pAttendereM = a * b * Po End Function *Po è la probabilità di presenza di 0 unità (che dev’essere dunque già calcolata), mentre Fattoriale è una funzione che consente il calcolo del fattoriale di un numero compreso fra 0 e 170. Probabilità di trovare esattamente n unità in coda La probabilità di trovare esattamente n unità in coda differisce lievemente rispetto a quella calcolata in un sistema M/M/1. Infatti, posto: 𝜆 𝜌= 𝜇 si ottiene un sistema per il calcolo di ogni Pn. 𝜌𝑛 𝑃 𝑠𝑒 𝑛 < 𝑘 𝑛! 0 𝑃𝑛 = 𝑛 𝜌 𝑃 𝑠𝑒 𝑛 ≥ 𝑘 𝑘! 𝑘 𝑛−𝑘 0 Nella funzione creata si è dunque dovuto tenere conto di questa condizione: il numero dei clienti è maggiore o minore al numero dei posti di servizio? CODICE Function probabilitaM(ByVal Po As Double, ByVal rho As Double, ByVal N As Integer, ByVal k As Integer) If N < k Then a = rho ^ N b = Fattoriale(N) probabilitaM = (a / b) * Po Else a = rho ^ N b = Fattoriale(k) * (k ^ (N - k)) probabilitaM = (a / b) * Po End If End Function * con Po sempre pari alla probabilità di presenza di 0 unità nel sistema, che dunque dev’essere già calcolato Nell’esercizio proposto, il numero di clienti per cui si vuole calcolare la probabilità è inferiore al numero di commessi: il valore di Pn verrà dunque trovato utilizzando il blocco vero dell’if sopra riportato. Pagina 18 Probabilità di attendere più di n minuti Spesso può risultare importante sapere quanto tempo un’unità presente nel sistema attenda in coda prima di essere servita. E’ interessante però sapere anche con quale probabilità un’unità nel sistema attenda più di w minuti. La formula per conoscere questo tempo è: 𝑃 𝑊𝑓 > 𝑤 = 𝑒 −𝜇𝑘𝑤 𝑝 1− 𝑘 ∗ 𝑃(𝑁 ≥ 𝑘) CODICE Function probAttesaM(ByVal mu As Double, ByVal k As Double, ByVal w As Integer, ByVal rho As Double, ByVal Pnk As Double) As Variant a = Exp(-mu * k * w * (1 - (rho / k))) probAttesaM = a * Pnk End Function * w è il tempo in minuti per cui si vuole calcolare la probabilità, mentre Pnk corrisponde alla probabilità di attendere (che, in ordine di esecuzione, dev’essere dunque calcolata precedentemente) Numero medio di unità in coda e nel sistema Questi due dati, oltre che essere importanti ai fini del calcolo in sé stesso, sono importanti anche per il calcolo del tempo medio di attesa in fila e del tempo medio di attesa nel sistema di coda. Numero medio di unità in coda Questa quantità si ottiene con la seguente formula 𝜌𝑘+1 𝑛= ∗ 𝑘 ∗ 𝑘! 1 1− 𝜌 𝑘 2 ∗ 𝑃0 CODICE Function unitaCodaM(ByVal Po As Double, ByVal rho As Double, ByVal k As Double) As Variant a = rho ^ (k + 1) b = k * Fattoriale(k) t1 = a / b c = (1 - (rho / k)) ^ 2 t2 = 1 / c unitaCodaM = t1 * t2 * Po End Function * Po (probabilità di presenza di 0 unità) dev’essere già stata calcolata Numero medio di unità nel sistema Per calcolare il numero medio di unità nel sistema, bisogna prima aver calcolato il numero medio di unità in coda. Infatti, la formula per il calcolo delle unità nel sistema di coda è: 𝑛= 𝜈+ 𝑘− 𝑣= 𝜈+ 𝜌 Pagina 19 CODICE Function unitaSistemaM(ByVal rho As Double, ByVal ni As Double) As Variant unitaSistemaM = ni + rho End Function *ni è il numero medio di unità in coda Numero medio di canali non occupati Un problema che affligge la maggior parte dei gestori di sistemi di coda è (come già detto nella teoria) l’ottimizzazione del servizio. Quindi, risulta molto importante il calcolo del numero medio di canali non occupati, al fine di ridurre i costi di gestione. Si calcola con la seguente formula: 𝑛=𝑘 𝑣= 𝑘 − 𝑛 𝑃𝑛 = 𝑘 − 𝜌 𝑛=0 CODICE Function canaliNonOccupati(ByVal k As Integer, ByVal rho As Double) As Variant canaliNonOccupati = k - rho End Function Tempo di inattività delle stazioni di servizio Altro problema di non poca importanza è relativo al tempo di inattività nell’arco della giornata lavorativa delle stazioni di servizio. Infatti, un tempo elevato può essere (ma non necessariamente) sintomo che la clientela ritenga il servizio inefficace e dunque preferisca rivolgersi altrove, oppure che siano presenti troppe stazioni di servizio: il gestore dovrà dunque prendere provvedimenti in tal proposito. Per questo calcolo risulta necessario sapere in primis il numero medio di canali non occupati. Dunque, la formula per trovare il tempo di inattività è: 𝑤𝑖𝑛𝑎𝑡𝑡 = 𝑣 ∗ 𝑡𝑒𝑚𝑝𝑜 𝑑𝑒𝑔𝑙𝑖 𝑎𝑟𝑟𝑖𝑣𝑖 CODICE Function inattivita(ByVal v As Variant, ByVal time As Integer) inattivita = v * time End Function Risoluzione dell’esercizio proposto Analogamente al precedente esercizio, inseriamo tutti i dati nel programma. Pagina 20 A questo punto clicchiamo su Simula!. Per inserire le probabilità richieste, facciamo click su Sì alla richiesta “Vuoi calcolare anche delle probabilità?” A questo punto, clicchiamo su OK. Il programma restituirà una schermata con i risultati. Anche in questo caso, possiamo decidere di esportare i risultati sul Desktop o di effettuare una nuova simulazione. Esportiamo il file ed analizziamo i risultati. Analisi dei risultati In questo negozio un cliente che entra ha circa il 32% di probabilità di attendere (l’attesa media è pari a 2 minuti e 8 secondi) l’arrivo di un commesso per essere servito. Al 19% si attesta la probabilità che egli trovi 3 persone in attesa di essere servite, mentre c’è una probabilità su 10 che debba attendere più di 7 minuti. Il cliente discuterà sul vestito da scegliere con il commesso per circa 10 minuti. Dopo 12 minuti e 8 secondi il cliente uscirà dal negozio, che mediamente conta tra 0 e 1 unità in coda e circa 3 unità nell’intero sistema. Per quanto riguarda l’ottimizzazione del servizio, il gestore può ritenersi abbastanza soddisfatto in quanto nell’arco della giornata le stazioni di servizio non occupate sono 1,5, mentre il tempo di inattività dei Pagina 21 commessi nelle 8 ore lavorative è pari a 720 minuti, ovvero 12 ore complessive che si perdono in attesa di clienti. Va detto che in quest’ottica, riducendo il numero di commessi a 3 si ottengono i seguenti risultati: Quindi, riducendo i commessi da 4 a 3, il tempo di inattività si riduce di un terzo e i canali non occupati passano da 1,5 a 0,5, ma aumentano i tempi di attesa per il cliente (il tempo di attesa in coda aumenta di circa 7 volte) e la probabilità di dover fare la coda, che passa dal 32% al 70%. Pagina 22 *********************************** ************ FAST QUEUE *********** *********************************** di Bianco Riccardo e Colosimo Paolo Data: 18/05/2009 Ora: 13.08.11 Dati della simulazione effettuata Tipo di coda ........................................... M/M/m -------------------------------------------------------------Unità arrivate ......................................... 120 In un tempo di ......................................... 8 ore Unità servite ...................................... 1 In un tempo di ..................................... 10 minuti -------------------------------------------------------------Tempi medi (mm:ss) Attesa in coda ........................................ 2:08 Attesa nel servizio ................................... 10:00 Attesa nel sistema .................................... 12:08 Inattività delle stazioni di servizio ................. 720:00 -------------------------------------------------------------Probabilità di Attendere ........................................ 0,319856704 Trovare esattamente 3 unità in coda .............. 0,191914023 Attendere più di 7 minuti ........................ 0,111929935 -------------------------------------------------------------Numero medio di: Unità in coda .......................................... 0,533 Unità nel sistema ...................................... 3,033 Canali non occupati .................................... 1,5 -------------------------------------------------------------- Pagina 23 Conclusioni generali Come si nota dall’aggiunta all’esercizio della coda M/M/m, la riduzione dei commessi ha portato alla diminuzione del numero di canali non occupati e conseguentemente al tempo di inattività delle stazioni di servizio. Il problema ricade però sul cliente: una persona che entra nel negozio è disposta ad attendere 7 volte il tempo che attendeva in precedenza? In generale, lo studio delle file d’attesa permette dunque la determinazione di parametri come il tempo medio di attesa in coda, la lunghezza media della coda, ecc., in modo che il gestore possa determinare al meglio l’organizzazione del servizio, con un occhio al disagio causato dalle attese e un occhio al portafoglio. Quindi, il servizio dev’essere dimensionato in modo che i clienti attendano poco e i posti di servizio non utilizzati debbano essere il minor numero possibile. Questi due obiettivi però si contrastano fra di loro: se si riduce il tempo di attesa, si aumentano le stazioni di servizio e quindi aumentano i costi. Di contro, diminuendo le stazioni di servizio, e quindi diminuendo i costi, si aumentano i tempi d’attesa, e dunque bisogna porsi la domanda: il cliente vorrà attendere o si rivolgerà altrove? In definitiva, qual è il miglior modello di coda tra quelle analizzate: quella con 1 o con k stazioni di servizio? La coda M/M/m è a piena capacità di servizio quando nel sistema si trovano m clienti, mentre la coda M/M/1 permette l’erogazione del servizio sempre a piena capacità, anche quando nel sistema si trova solo un cliente. Insomma, la scelta del modello di coda ha i suoi vantaggi e i suoi svantaggi: il sistema M/M/1 ha prestazioni superiori, ma bisogna ovviamente sapere in che contesto è inquadrato. In conclusione, il problema delle code è abbastanza semplice dal punto di vista numerico, un po’ meno sotto il punto di vista decisionale. Strumenti utilizzati: Microsoft Office 2007, che ha permesso anche la creazione delle varie formule descritte Microsoft Excel 2007, per le illustrazioni grafiche nella parte teorica Blocco note, per l’apertura dei file testuali di resoconto Microsoft Visual Basic 6, per la creazione dell’algoritmo implementato su un’interfaccia grafica Caratteri tipografici “Ericsson GA628” e “Digital Readout Thick Upright”, per la simulazione dei display Carattere tipografico “Ferro Rosso”, per il titolo del programma Strumento di cattura (presente in Microsoft Windows Vista), per gli screenshoot relativi al programma Bibliografia: Trovato - “Statistica, calcolo delle probabilità, ricerca operativa” – Ghisetti e Corvi Editori Gambotto Manzone, Longo - “Inferenza statistica e ricerca operativa” - Tramontana Pagina 24 Schembra - “Metodi per l’analisi e il dimensionamento delle reti / Lezione 2 – Teoria delle code” (pdf) “DevX” (http://www.devx.com/vb2themax/Tip/19016) per la funzione del calcolo fattoriale. “Microsoft Aiuto & Supporto” (http://support.microsoft.com/kb/213449/it) per la funzione che converte un tempo nel sistema decimale in un tempo nel sistema sessagesimale. “Il forum di HTML.it” (http://forum.html.it/forum/showthread/t-829214.html) per la funzione che trova il percorso assoluto del desktop, indipendentemente dal computer su cui si avvia il programma. “VB Tips Varie” (http://digilander.libero.it/007mp/vb/vbtips/varie1.htm) per la funzione che consente di cambiare colore alla barra del titolo “Flickr” (http://www.flickr.com/photos/ehiuomo/1310624064/) per la foto della barriera di Venezia-Mestre in copertina “Wikipedia”, (http://it.wikipedia.org) l’enciclopedia libera “Youtube”, (http://www.youtube.com/watch?v=UT4dYrpZVY0) per lo spot della compagnia telefonica “Blu” citato nell’introduzione Pagina 25