Package SimPy : types de ressources

Simulation d’événements discrets en Python

Dr Diogo Costa

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

Types de ressources disponibles

  • SimPy propose trois types de ressources :

  • resource

  • container
  • store
Simulation d’événements discrets en Python

Types de ressources disponibles

simpy.Resource()

  • Partager des ressources entre processus
  • Exemple : tables d’un restaurant

simpy.Container()

  • Ressource pour partager une matière homogène entre processus
  • Quantités discrètes (p. ex. pommes) ou continues (p. ex. eau)
  • Exemple : réservoir d’eau

simpy.Store()

  • Stocker une quantité potentiellement illimitée d’objets
  • Exemple : supermarché
Simulation d’événements discrets en Python

Méthode : simpy.Resource()

Création d’une ressource

resource_1 = simpy.Resource(env, capacity=8)
  • À utiliser quand la capacité est limitée (p. ex. capacity=8)
  • Limite le nombre de processus accédant simultanément à la ressource
  • Un processus doit demander le droit d’usage
    • Si tout est occupé, les demandes sont mises en file d’attente
  • Quand un processus libère la ressource, les demandes en attente se déclenchent

Demander une ressource

# Ouvrir la demande de ressource
with resource_1.request() as request:

# Faire la demande yield request
# Une fois la ressource disponible yield env.timeout(event_duration)
Simulation d’événements discrets en Python

Ressources : priorités et préemption

  • Variante de la ressource précédente

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Certains processus ont priorité sur d’autres

  • Exemple : technicien

    • Priorité 1 : réparer les machines en panne
    • Priorité 2 ou moins : maintenance
  • Usage similaire à simpy.Resource()

  • Demande avec priorité la plus élevée

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • Demande avec priorité plus faible

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Simulation d’événements discrets en Python

Méthode : simpy.Container()

  • Utile pour modéliser la production/consommation de matière homogène, non différenciée

  • Peut être continue (eau) ou discrète (pommes)

Exemple : Réserves d’essence d’une station-service.

  • Les voitures diminuent les réserves, les camions-citernes les augmentent
  • Créer un conteneur
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • Ajouter/retirer du conteneur/réservoir

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Obtenir la quantité actuelle

    tank_1.level
    
  • Obtenir la capacité totale

    tank_1.capacity
    
Simulation d’événements discrets en Python

Méthode : simpy.Store()

  • Créer un magasin

    store_1 = simpy.Store(
    env, capacity=2)
    
  • Semblable à simpy.Container() mais permet de stocker des objets différents

  • Contrairement à la « quantité » abstraite stockée dans les conteneurs

  • Ajouter/retirer du stockage
yield store_1.put("item_1")
yield store_1.get()
  • Obtenir la liste des éléments disponibles

    store_1.items
    
  • Obtenir la capacité du magasin

    store_1.capacity
    
Simulation d’événements discrets en Python

Comment les ressources SimPy aident-elles les décisions métiers ?

Exemple

  • Supermarché avec 1 caissier
  • Le gérant veut savoir s’il vaut la peine d’investir dans plus de caissiers
  • Plus de caissiers réduiront-ils l’attente ?

Situation actuelle : 1 caissier

  • simpy.Resource(env, capacity=1)
...
temps : 23,7 min | Client 30 > Terminé

Scénarios simulés : n caissiers

  • simpy.Resource(env, capacity=2)
...
temps : 13,2 min | Client 30 > Terminé
  • simpy.Resource(env, capacity=3)
...
temps : 8,6 min | Client 30 > Terminé
  • simpy.Resource(env, capacity=4)
...
temps : 8,6 min | Client 30 > Terminé
Simulation d’événements discrets en Python

Passons à la pratique !

Simulation d’événements discrets en Python

Preparing Video For Download...