Modèle de restaurant : gestion des tables et des temps d’attente
Imaginez que vous souhaitiez ouvrir un restaurant dans un quartier prisé de San Francisco. Déterminer le nombre de tables et la capacité de la cuisine est crucial pour servir un maximum de clients tout en minimisant l’investissement initial et les coûts d’exploitation. Un modèle à événements discrets peut vous aider dans cette décision en simulant le taux d’occupation des tables, les temps d’attente des clients et le nombre de clients qui quittent la file en raison d’une attente trop longue.
Commençons par définir le générateur qui simule les demandes de tables et la décision des clients d’attendre ou de partir en fonction du temps d’attente. Dans l’exercice suivant, vous mettrez en place le modèle, l’exécuterez et analyserez les résultats. Le temps dans le modèle est exprimé en minutes.
Cet exercice fait partie du cours
Simulation d’événements discrets en Python
Instructions
- Ouvrez une demande de table sous le nom
reqlorsqu’un client arrive au restaurant. - Utilisez un opérateur OU bit à bit pour attendre qu’une table se libère (
req) ou que le client perde patience (env.timeout(patience)). - Produisez la durée d’occupation de la table par le client, donnée par la variable
time_at_tables.
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
def customer(env, name, tables):
global customers_served, customers_quiting_waiting
arrive = env.now
# Request a table
with tables.request() as ____:
patience = random.uniform(MIN_PATIENCE, MAX_PATIENCE)
# Wait until a table is free or the customer runs out of patience
results = yield ____ | ____
wait = env.now - arrive
if req in results:
print(f"{env.now:7.4f} {name} > Waited {wait:6.3f} minutes for a table!")
time_at_tables = random.uniform(MIN_SEATING_TIME, MAX_SEATING_TIME)
# Yield the time the table is occupied by the customer
____ env.timeout(time_at_tables)
print(f"{env.now:7.4f} {name} > Finished meal :)")
costumers_served += 1
else:
print(f"{env.now:7.4f} {name} > Gave up waiting and left after waiting {wait:7.4f} minutes :(")
customers_quiting_waiting += 1