Forfait 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 offre 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é possiblement illimitée d'objets
  • Exemple : supermarché
Simulation d'événements discrets en Python

Méthode : simpy.Resource()

Créer une ressource

resource_1 = simpy.Resource(env, capacity=8)
  • À utiliser quand la capacité est limitée (p. ex., capacity=8)
  • Pour limiter le nombre de processus accédant simultanément à une ressource
  • Un processus doit demander le droit d'usage de la ressource
    • Si toutes les ressources sont utilisées, les demandes sont mises en file
  • Quand des processus libèrent la ressource, les demandes en attente sont déclenchées

Demander une ressource

# Ouvrir une 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

  • Variation de la ressource précédente

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • Certains processus peuvent avoir priorité sur d'autres

  • Exemple : technicien de réparation

    • Priorité 1 : réparer les machines en panne
    • Priorité 2 ou moins : entretien des machines
  • Utilisation semblable à 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é inférieure

    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 d'une masse homogène et indifférenciée

  • Peut être continue (comme l'eau) ou discrète (comme des pommes)

Exemple : réserves d'essence d'une station-service.

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

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • Obtenir la quantité actuelle dans le réservoir

    tank_1.level
    
  • Obtenir la capacité totale du réservoir

    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 d'entreposer des objets différents

  • Contrairement à la notion plus abstraite de « quantité » dans les conteneurs

  • Ajouter et retirer de l'entreposage
yield store_1.put("item_1")
yield store_1.get()
  • Obtenir la liste des articles disponibles

    store_1.items
    
  • Obtenir la capacité du magasin

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

Comment les ressources SimPy éclairent-elles les décisions d'affaires ?

Exemple

  • Supermarché avec 1 caissier
  • Le propriétaire 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)
...
time: 23.7 min | Customer 30 > Finished

Scénarios simulés : n caissiers

  • simpy.Resource(env, capacity=2)
...
time: 13.2 min | Customer 30 > Finished
  • simpy.Resource(env, capacity=3)
...
time: 8.6 min | Customer 30 > Finished
  • simpy.Resource(env, capacity=4)
...
time: 8.6 min | Customer 30 > Finished
Simulation d'événements discrets en Python

Passons à la pratique !

Simulation d'événements discrets en Python

Preparing Video For Download...