Simulation d’événements discrets en Python
Dr Diogo Costa
Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific
L’occurrence d’événements réels peut être affectée par plusieurs situations.
Les plus courantes impliquent :
Ces situations peuvent être modélisées en SimPy (événements discrets).
Exemple
Des clients arrivent dans un magasin de vêtements
def customer_arrivals(env, shop)
Cherchent un article précis
env.timeout(search_time)
if shop.available[item]:
Générateur : rassembler tout le code
def customer_arrivals(env, shop):while True: yield env.timeout(search_time)# Acheter l’article seulement s’il est disponible if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
Certains événements peuvent être interrompus en raison de :
Méthode
simpy_process_1.interrupt()
Exemple
Une machine tombe périodiquement en panne, interrompant la production.
def break_machine(env):# Panne périodique de la machine. while True: # Temps entre pannes yield env.timeout(fail_time())# Panne : interrompre le processus simpy_process_1.interrupt()
capacity=5 :simpy.Resource(env, capacity=5)
Exemple : Les réserves d’essence d’une station doivent être régulièrement réapprovisionnées
with gas_station.request() as request:# Demander une pompe yield request# Une fois la pompe disponible : distribuer le carburant liters_request = 10 yield fuel_reserve.get(liters_request) # Le « vrai » ravitaillement prend du temps refuel_duration = liters_request / refuel_speedyield env.timeout(refuel_duration)
Opérateurs binaires
a & b, a >> b, a ^ bDans SimPy
Opérateurs binaires utiles pour SimPy
__and__() ou &__or__() ou |Exemple : Un spectateur attend à la billetterie jusqu’à son tour ou l’épuisement des billets
with counter.request() as my_turn:# Attendre son tour ou l’épuisement des billets result = yield my_turn | counter.sold_out[movie]# Si des billets sont disponibles if my_turn in result: theater.num_moviegoers[movie] += 1 return# Si les billets sont épuisés if my_turn not in result: theater.num_renegers[movie] += 1 return
Simulation d’événements discrets en Python