Model restauracji: zarządzanie stolikami i czasem oczekiwania
Wyobraź sobie, że chcesz otworzyć restaurację w popularnej dzielnicy San Francisco. Decyzja o liczbie stolików i przepustowości kuchni ma kluczowe znaczenie – chodzi o obsłużenie jak największej liczby klientów przy jednoczesnym ograniczeniu kosztów inwestycji i eksploatacji. Model dyskretno-zdarzeniowy może wspomóc tę decyzję, symulując poziom zajętości stolików, czas oczekiwania klientów oraz liczbę osób rezygnujących z kolejki z powodu zbyt długiego oczekiwania.
Zacznijmy od zdefiniowania generatora, który symuluje żądania o stolik i decyzje klientów – czy czekać, czy odejść – w zależności od czasu oczekiwania. W następnym ćwiczeniu skonfigurujesz model, uruchomisz go i przeanalizujesz wyniki. Czas w modelu podawany jest w minutach.
To ćwiczenie jest częścią kursu
Symulacja zdarzeń dyskretnych w Pythonie
Instrukcje do ćwiczenia
- Otwórz żądanie stolika jako
req, gdy klient pojawia się w restauracji. - Użyj operatora bitwise-or, aby poczekać, aż zwolni się stolik (
req) lub skończy się cierpliwość klienta (env.timeout(patience)). - Wykonaj yield na czas zajęcia stolika przez klienta, określony przez zmienną
time_at_tables.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
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