En överblick Pseudo-parallell simulering Kjartan Halvorsen Systemteknik Inst för IT Uppsala Universitet På föreläsningen Simulering pseudo-parallell simulering SimPy Implementering av snabbköpsexemplet Inlämningsuppgift Introduktion, hjälptider -4-6 Två olika sätt att modellera och simulera Vi skiljer mellan Händelsestyrd simulering Beskriv alla händelser och konsekvenser av dessa. Pseudo-parallell simulering Beskriv erna som ingår i modellen, och hur dessa interagerar. Processerna påverkar varandra händelser leder till följdhändelser. Pseudo-parallell simulering Schedulering Huvudprogram Modellen är parallell, men i simuleringen exekveras endast en åt gången. Detta styrs m.h.a. en lista med tidpunkter för när en ska exekveras, samt vart i en exekveringen ska ta vid. Initiera modeller eventlist time @ modell modell modell Simulera Slut Model
Processtillstånd Processtillstånd, forts Processerna kan befinna sig i olika tillstånd aktiv Processen står först i händelselistan och exekverar. Det kan endast finnas en aktiv samtidigt i simuleringen. passiv Processen exekverar inte och finns inte med i händelselistan. suspenderad Processen exekverar inte, men finns med i händelselistan. terminerad Processen är avslutad, och kan inte aktiveras igen. Byte av tillstånd Processen som aktiveras flyttas in (oftast först) i händelselistan. En kan inte aktivera sig själv. Den aktiva en passiverar sig själv gem att ge upp (temporärt) exekveringen utan att sättas upp på händelselistan. hold Processen sätts upp på händelselistan för att fortsätta exekveringen länger fram. terminera Processen har löpt klart. Snabbköpsexemplet, igen Vi beskriver varje med flödesscheman enter store (is d) ( ) queue empty? remove first from queue serve Kassa shop enter queue idle? leave (is d) Kund initiate, load data wait random time ) closing time? create and new Kundgenerator generator generator) Huvudprogram () simulate generator print results Main program
Simulera för hand, igen Snabbköpsexemplet, facit Givet följande slumptal Tid mellan ankomster.4,.9,.8, Tid att handla.3,.8,. Betjäningstid.6,.,.4 Simulera snabbköpssystemet för hand. Ställ upp händelselistan för de första sekunderna. Tid Process @ Kommentar. Kassa Blir passiv direkt. Kundgenerator Väntar, åter aktiv:.4.4 Kundgenerator Väntar, åter aktiv: 3.3.4 Kund Handlar, väntar, åter aktiv: 4.7 3.3 Kundgenerator Väntar, åter aktiv: 6. 3.3 Kund Handlar, väntar, åter aktiv: 5. 4.7 Kund In i kö, aktivera Kassa, passiv 4.7 Kassa ar betj, väntar, klar: 6.3 5. Kund In i kö, passiv 6. Kundgenerator Väntar, åter aktiv:? 6. Kund 3 Handlar, väntar, åter aktiv: 8. 6.3 Kassa Betj klar, aktivera K, betj K klar: 8.5 6.3 Kund Lämnar butiken SimPy Processtillstånd Processtillstånd, SimPy, forts. Antag två objekt: c = (name= " Kund " ) reg = (name= " Kassa " ) Byte av tillstånd i SimPy (c,c.goshopping()) Metoden goshopping i kund-objektet kommer exekveras. Denna metod omtalas som Process Execution Method (PEM) i SimPy-dokumentationen. Byte av tillstånd i SimPy I en PEM: yield, self Exekveringen av PEM stoppas, och kommer återupptas vid obestämt tidpunkt. Argumenten och self returneras från PEM. hold I en PEM: yield hold, self,.34 Exekveringen av PEM stoppas, men kommer återupptas när simuleringstiden har löpt ytterligare.34 tidsenheter. Argumenten hold, self och flyttalet.34 returneras. Snabbköpsexemplet, igen Vi beskriver varje med flödesscheman (is d) ( ) queue empty? remove first from queue serve def serve ( s e l f ) : while : s e l f. i d l e = # Väntande kunder? while ( Q!= [ ] ) : # Nä sta kund ur kön c = Q. pop ( ) # B e t j äna. t = Rnd. expovariate ( srate ) # Tilbaka. A k t i v e r a kund r e a c t i v a t e ( c ) # Kön tom. Ta paus s e l f. i d l e = y i e l d, s e l f enter store shop enter queue idle? leave (is d) def goshopping ( s e l f ) : # K o l l a s i m u l e r i n g s t i d e n # v i d ankomst a r r i v e = w ( ) # Handla. t = Rnd. rmalvariate ( 3,. ) # Och sedan i n i kö Q. append ( s e l f ) # A k t i v e r a kassan om passiv i f reg. i s I d l e ( ) : r e a c t i v a t e ( reg ) # Vänta i p a s s i v t l äge y i e l d, s e l f # T i l b a k s e f t e r b e t j äning # Tiden i butiken wait = w ( ) a r r i v e
wait random time closing time? create and new () generator def generate ( s e l f ) : i = while : # Vänta t = Rnd. expovariate ( arate ) i f (w ( ) > closet ) : break # A k t i v e r a ny kund. i += c = ( name = \ " Kund%d "%(i, ) ) a c t i v a t e ( c, c. goshopping ( ) ) initiate, load data generator simulate print results Main program ) generator) # I n i t i e r a s i m u l a t o r n i n i t i a l i z e ( ) # Skapa och a k t i v e r a erna reg = (name= " Kassa " ) a c t i v a t e ( reg, reg. serve ( ) ) cg = Generator ( ) a c t i v a t e ( cg, cg. generate ( ) ) # Simulera t i d s e n h e t e r simulate ( u n t i l =) # S k r i v ut r e s u l t a t Simulera med SimPy Givet följande slumptal Tid mellan ankomster.4,.9,.8, Tid att handla.3,.8,. Betjäningstid.6,.,.4 Simulera snabbköpssystemet. Ta fram händelselistan för de första sekunderna. Observera kölängd och väntetider i simuleringen Monitor-objekt är väldigt smidiga för att göra observationer under simuleringens gång, t.ex: class G: qmonitor = Monitor ( ) ; waitmonitor = Monitor ( ) Q = [ ] class ( Process ) def goshopping ( s e l f ) : a r r i v e = w ( ) y i e l d hold, s e l f, shoppingtime G. Q. append ( s e l f ) # A k t u e l l kö l ängd G. qmonitor. observe ( len (G. Q ) ) y i e l d, s e l f # Tid i butiken wait = w ( ) a r r i v e G. waitmonitor. observe ( wait ) Snabbköpet, simuleringen from SimPy.SimulationTrace import istället för from SimPy.Simulation import ger a c t i v a t e <Kassa > at time : p r i o r : False a c t i v a t e <Kundgenerator > at time : p r i o r : False < Kassa > hold < Kundgenerator > delay :.4.4 a c t i v a t e <Kund > at time :.4 p r i o r : False.4 hold < Kundgenerator > delay :.9.4 hold < Kund > delay :.3 3.3 a c t i v a t e <Kund > at time : 3.3 p r i o r : False 3.3 hold < Kundgenerator > delay :.8 3.3 hold < Kund > delay :.8 4.7 r e a c t i v a t e <Kassa > time : 4.7 p r i o r : False 4.7 < Kund > 4.7 hold < Kassa > delay :.6 5. < Kund > 6. a c t i v a t e <Kund3 > at time : 6. p r i o r : False 6. <Kundgenerator > terminated 6. hold < Kund3 > delay :. 6.3 r e a c t i v a t e <Kund > time : 6.3 p r i o r : False 6.3 hold < Kassa > delay :. 6.3 <Kund > terminated 8. < Kund3 > 8.5 r e a c t i v a t e <Kund > time : 8.5 p r i o r : False 8.5 hold < Kassa > delay :.4 8.5 <Kund > terminated 9.9 r e a c t i v a t e <Kund3 > time : 9.9 p r i o r : False 9.9 < Kassa > 9.9 <Kund3 > terminated Observera kölängd och väntetider i simuleringen, forts. Monitor-objekten är i princip en lista av observationer [ t,y]. qmon.count() returnerar antal observationer. qmon.total() summan av alla observationer. qmon.mean() = qmon.total()/ qmon.count(). qmon.timeaverage() beräknar ett viktat medelvärde, beroende på tiden mellan varje observation. qmon.timevariance() Viktat beräkning av variansen.
a/stoppa simuleringen Hitta SimPy dokumentation Simuleringen startas med anropet SimPy.Simulation.simulate(until=4) Simuleringen tar slut när det första av följande inträffar Simuleringstiden når sluttiden (i det här fallet 4) Händelselistan töms Anropet SimPy.Simulation.stopSimulation() exekveras Dokumentation för SimPy: http://simpy.sourceforge.net/simpydocs/index.html Se även http://simpy.sourceforge.net/simpy_overview.htm som ger en snabb överblick. Inlämningsuppgift Nästa lektion Deadline Måndag --8 kl 5. Hjälp Mondag -- 7-9 i 3 (Mojtaba) Onsdag --3 7-9 i 3 (Mojtaba) Att läsa inför föreläsningen Simuleringens statistiska metoder, Kap 3, s 45-53. Queueing, Kap 4 s 59-8. På föreläsningen Sanlikhetsfördelninger Ankomst- och betjäningstider Köteori prestandamått, analys av steady-state Statistik Konfidensintervall Pseudo-slumptal Deterministisk serie tal med slumptalsegenskaper