SimPy-paketet: hantera schemaläggning av händelser

Diskret händelsesimulering i Python

Dr Diogo Costa

Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific

Hantera händelseförlopp

  • Händelser i verkliga problem kan påverkas av flera situationer.

  • De vanligaste situationerna är:

    • villkorliga händelser
    • avbrott av händelser
    • väntan på processer

Dessa situationer kan modelleras i SimPy:s diskreta händelsemodell.

Diskret händelsesimulering i Python

Villkorliga händelser

  • Vissa händelser beror på att andra händelser inträffar
  • De utlöses bara om ett villkor uppfylls

Exempel

  • Kunder anländer till en klädbutik

    def customer_arrivals(env, shop)
    
  • Söker efter ett visst plagg

    env.timeout(search_time)
    
  • Köper bara om varan finns i lager
if shop.available[item]:

Generator: all kod samlad

def customer_arrivals(env, shop):

while True: yield env.timeout(search_time)
# Only buy item if available if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Diskret händelsesimulering i Python

Avbrott av händelser

Vissa händelser kan avbrytas av:

  • Händelser med högre prioritet
  • Frivilliga avbrott (t.ex. laddning av bil)
  • Tvingande avbrott (t.ex. maskinfel)

Metod

simpy_process_1.interrupt()

Exempel

Maskinen går sönder periodvis och avbryter produktionslinjen.

def break_machine(env):

# Break machine every now and then. while True: # Time between machine fails yield env.timeout(fail_time())
# Machine fail: interrupt process simpy_process_1.interrupt()
Diskret händelsesimulering i Python

Väntan på processer

  • Vissa processer måste vänta på att andra ska slutföras
  • Det beror ofta på att resurser är begränsade
  • Exempel: delad resurs med capacity=5:
    simpy.Resource(env, capacity=5)
    
  • En process kan alltså behöva vänta om alla resurser används

Exempel: Bränsleförrådet på en bensinstation behöver fyllas på regelbundet

with gas_station.request() as request:

# Request one of the gas pumps yield request
# Once pump is available: pump fuel liters_request = 10 yield fuel_reserve.get(liters_request) # The "actual" refueling takes time refuel_duration = liters_request / refuel_speed
yield env.timeout(refuel_duration)
Diskret händelsesimulering i Python

Kombinera händelser med bitvisa operatorer

Bitvisa operatorer

  • Utför bitvisa beräkningar på heltal
  • Kräver två operander
    • Exempel: a & b, a >> b, a ^ b

I SimPy

  • Genererar en villkorshändelse
  • Mellan 2 händelser

Relevanta bitvisa operatorer för SimPy

  • Väntar på båda processerna: __and__() eller &
  • Väntar på endera processen: __or__() eller |
Diskret händelsesimulering i Python

Kombinera händelser med bitvisa operatorer

Exempel: En biobesökare väntar i biljettkön tills det är hans/hennes tur eller biljetter tar slut

with counter.request() as my_turn:

# Wait until turn or movie is sold out result = yield my_turn | counter.sold_out[movie]
# If tickets available if my_turn in result: theater.num_moviegoers[movie] += 1 return
# If tickets sold out if my_turn not in result: theater.num_renegers[movie] += 1 return
Diskret händelsesimulering i Python

Nu kör vi en övning!

Diskret händelsesimulering i Python

Preparing Video For Download...