IniziaInizia gratis

Modello del ristorante: gestione dei tavoli e dei tempi di attesa

Immagina di voler aprire un ristorante in una zona molto frequentata di San Francisco. Decidere il numero di tavoli e la capacità della cucina è fondamentale per servire il maggior numero possibile di clienti riducendo al minimo l’investimento iniziale e i costi operativi. Un modello a eventi discreti può aiutarti in questa decisione simulando il livello di occupazione dei tavoli, i tempi di attesa dei clienti e il numero di clienti che lasciano la coda per attese eccessive.

Definiamo innanzitutto il generatore che simula le richieste di tavoli e le decisioni dei clienti di aspettare o andarsene in base ai tempi di attesa. Nel prossimo esercizio imposterai il modello, lo eseguirai e analizzerai i risultati. Il tempo nel modello è espresso in minuti.

Questo esercizio fa parte del corso

Simulazione a eventi discreti in Python

Visualizza il corso

Istruzioni dell'esercizio

  • Apri una richiesta di tavolo come req quando un cliente arriva al ristorante.
  • Usa un operatore bitwise-or per aspettare finché non si libera un tavolo (req) oppure finché il cliente non perde la pazienza (env.timeout(patience)).
  • Esegui il yield del tempo in cui il tavolo è occupato dal cliente, dato dalla variabile time_at_tables.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

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
Modifica ed esegui il codice