Homepage  Il progetto dsy.it è l'unofficial support site i corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, la chat, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto dei nostri blogs


Guarda la pagina live qui


.dsy:it. .dsy:it. ~ Walter's journal ~ uni~ Simulazione dello straordinario di un farmacista
 
uni~ Simulazione dello straordinario di un farmacista
29-10-2006 20:45
»
Questo esercizio è stato proposto nel corso di Simulazione, e il prof l'ha risolto con Mathematica... dal momento che preferisco soluzioni free, ecco la soluzione (commentata) realizzata con Scilab.
La posto per i seguenti motivi:
1- chiarisce le idee a chi, in cerca di un complementare, è stato tentato dal nome cool :asd: di questo insegnamento, ma ne ha preferito un altro di cui erano disponibili più informazioni (Simulazione è stato attivato quest'anno);
2- pubblicizza Scilab, per chi desidera provare alternative gratuite (e open source) a Matlab, Mathematica e simili software per il calcolo numerico;
3- è un esempio di quel che si può fare con la simulazione, interessante anche per i curiosi e i non addetti ai lavori.

Il problema è il seguente: in farmacia arrivano clienti e il farmacista ha bisogno di tempo per soddisfare ciascuna richiesta. Naturalmente, in alcune situazioni, può crearsi una coda. Per quanto il farmacista si impegni, può capitare che talvolta debba fare straordinario per soddisfare le richieste dei clienti che si erano messi in coda prima del termine dell'orario di lavoro.
Scopo dell'esercizio è stimare i minuti di straordinario del farmacista, noto che:
- l'intervallo di tempo tra l'arrivo di un cliente e di quello successivo (deltat) è una variabile aleatoria di distribuzione esponenziale di parametro n;
- il tempo richiesto per soddisfare la richiesta di un cliente (filltime) è una variabile aleatoria di distribuzione normale con media m e deviazione standard s.

Con Scilab si può procedere in questo modo:

1) si definisce una funzione che riceve in ingresso un parametro n (assumiamo che la giornata di lavoro abbia 480', in tal caso 480/n è l'intertempo medio di arrivo dei clienti) e restituisce una singola (1,1) specificazione di una variabile aleatoria con distribuzione esponenziale ('exp') di parametro n e quindi media 480/n:

code:
function [x]=interTempo(n) x=grand(1,1,'exp',480/n) endfunction


2) si definisce una funzione che riceve in ingresso due parametri m e s e restituisce una singola (1,1) specificazione di una variabile aleatoria con distribuzione normale ('nor') di media m e deviazione standard s (dal momento che si tratta di un ritardo, non accettiamo specificazioni di valore negativo... in tal caso restituiamo 0):

code:
function [x]=fillTime(m,s) x=max(0,grand(1,1,'nor',m,s)) endfunction


3) si definisce una funzione che riceve in ingresso i parametro n, m, s, e restituisce una tabella così costituita:
- I colonna: intertempi di arrivo dei clienti;
- II colonna: tempi necessari alla soddisfazione delle richieste dei clienti.
Vengono aggiunte righe ($+1) finchè la somma degli intertempi non supera 480 (il che significa: al termine dell'orario di lavoro, nessun cliente può più mettersi in coda).

code:
function [simtable]=simulatePharma(n,m,s) t=0; while t<=480 do iT=interTempo(n); t=t+iT; simtable($+1,[1:2])=[iT,fillTime(m,s)]; end endfunction


4) si definisce una funzione accessoria che riceve in input una tabella e un numero di colonna e restituisce un vettore in cui l'i-esimo elemento è somma di tutti gli elementi precedenti:

code:
function [cumtable]=cumulate(table,col) i=2; rows_number=size(table,'r'); cumtable(1)=simtable(1,col); while i<=rows_number do cumtable(i)=cumtable(i-1)+simtable(i-1,col); i=i+1; end endfunction


5) si definisce una funzione che riceve in input una tabella e restituisce un vettore il cui i-esimo elemento rappresenta il tempo in cui la richiesta dell'i-esimo cliente sarà stata soddisfatta.
max(0,old-table(i,1)) rappresenta il tempo che l'i-esimo cliente passa in coda.
table(i,2) rappresenta il tempo necessario al farmacista per soddisfare la richiesta dell'i-esimo cliente.

code:
function [workt]=worktime(table) workt(1)=table(1,2); old=table(1,2); i=2; while i<=size(table,'r') do new=max(0,old-table(i,1))+table(i,2); workt(i)=new; old=new; i=i+1; end endfunction


6) si definisce la funzione che riceve in input n, m, s, avvia la simulazione completa (richiama tutte le funzioni precedenti) e restituisce il numero dei minuti lavorati dal farmacista, cioè
- un valore pari a 480 se non dovrà fare straordinario
- altrimenti un valore maggiore e pari alla somma del minuto in cui è arrivato in farmacia l'ultimo cliente (times($,$)) e i minuti di lavoro "arretrato" che si sono accumulati nel corso della giornata (workt($,$)).

code:
function [min_work]=goSimulate(n,m,s) simtable=simulatePharma(n,m,s); times=cumulate(simtable,2); workt=worktime(simtable); min_work=max(480,times($,$)+workt($,$)) endfunction



Ecco infine un esempio di simulazione numerica, la ripetiamo 365 volte:

code:
n = 32; m = 10; s = 4; k=1; while k<=365 do workdays(k)=goSimulate(n,m,s); k=k+1; end


Al termine del calcolo, workdays è un vettore di 365 righe contenente valori maggiori o uguali a 480.
Per riassumere i risultati, possono essere raggruppati in questo modo evidenziandone la frequenza:
code:
--> tabul(workdays) ans= 583.4238 1. 550.72706 1. 550.66163 1. 513.2591 1. 499.7507 1. 497.06635 1. 496.98472 1. 490.45547 1. 490.1833 1. 480. 356.


Nella maggior parte dei casi (356/365 giorni di lavoro), il farmacista tornerà a casa in orario (per la gioia della moglie :D).
In un giorno particolarmente sfigato, il farmacista dovrà fare più di un'ora e mezzo di straordinario :sbonk:
Mediamente, ogni giorno il farmacista lavorerà:
code:
--> mean(workdays) ans = 480.96579

Poi si potrebbero fare un po' di grafici :)
User Mood mood: (none) | Now Playing now playing: (none)


Commento di Bulma
29-10-2006 20:45
»
Bello! Secondo me può essere utile per capire le applicazioni pratiche della statistica nella vita quotidiana (e nell'informatica). Magari l'anno prossimo potrei seguirlo...

Commento di Walter
29-10-2006 20:45
»
Per quanto visto finora, il corso inoltre tratta: - il funzionamento delle routine che generano specificazioni di variabili casuali con distribuzioni varie. A partire da una distribuzione uniforme in [0,1), vengono illustrate le tecniche (svincolate da linguaggi o applicativi) per ottenere tutte le altre distribuzioni; - alcune tecniche di stima dei parametri delle distribuzioni, a partire da dati di eventi simulati. Non è male! Ma è tutta statistica, è necessario masticarla e ri-masticarla un po' per capirla :asd:... e poi Malchiodi corre come un treno :D

Commento di Walter
29-10-2006 20:45
»
Dimenticavo... un tutorial passo-passo su Scilab: [url]http://h0.web.u-psud.fr/orscilab/index.html[/url] Un po' troppo colorato :D, e non del tutto completo... ma interessante :D

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento | Thanks | Syndacate