Zacznij terazZacznij za darmo

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

Zobacz kurs

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
Edytuj i uruchom kod