TdP-prove-finali / Introduzione

Istruzioni e documentazione per la proposta e lo svolgimento delle prove finali relative al corso di Tecniche di Programmazione.
http://bit.ly/tecn-progr
Apache License 2.0
4 stars 13 forks source link

Gestore menù ristorante, numero di clienti e postazioni in cucina. #71

Closed giogenna16 closed 2 years ago

giogenna16 commented 3 years ago

Studente proponente

s258261 Giovanni Genna

Titolo della proposta

Gestore menù ristorante, numero di clienti e postazioni in cucina.

Descrizione del problema proposto

L'applicazione che si vorrebbe sviluppare andrebbe a creare, in primis, degli elenchi di cibi che non contengano determinati ingredienti (da 0 a 3), per esempio per escludere cibi che possano causare allergie e/o intolleranze, o semplicemente cibi non graditi al consumatore. Composto un elenco, si vorrebbe generare un menù ad hoc che contenga il massimo numero di cibi, tale che i cibi stessi abbiamo al più x calorie, y grassi e z zuccheri aggiunti (in media, in base alle porzioni in cui sono serviti). Composto un menù, si vuole effettuare una simulazione, in cui entrano in gioco N clienti e M postazioni di cucina e, avere alla fine la percentuale di clienti soddisfatti dal servizio. I cibi avranno, dunque, un tempo di preparazione medio di 20 minuti e ogni cliente, con la stessa probabilità, potrà scegliere 1, 2 o 3, portate: un cliente si ritiene insoddisfatto se aspetta per essere servito, rispettivamente più di 30, 50 o 80 minuti.

Descrizione della rilevanza gestionale del problema

L'interesse gestionale dell'applicazione è la possibilità per un imprenditore, che abbia a disposizione determinati cibi e ingredienti nel suo ristorante, di creare dei menù studiati per una determinata clientela, escludendo certi ingredienti e selezionando solo determinati valori nutrizionali. Sarà possibile, per il gestore, avere un'idea teorica di quanto tempo sia necessario per servire un certo numero di clienti, avendo a disposizione un tot di postazioni (e, se si vuole, di dipendenti). In base ai risultati della simulazione, il ristoratore potrà decidere se lasciare invariati il numero di coperti e il numero di postazioni o di modificarli per migliorare il grado di soddisfazione della clientela.

Descrizione dei data-set per la valutazione

Il database che si vuole utilizzare per reperire le informazioni (cibi, ingredienti e porzioni) da far elaborare all'applicazione è "food_pyramid_mod" che riporta le qualità nutrizionali di una serie di cibi ed ingredienti. Il dataset (estratto dal sito https://catalog.data.gov/dataset/mypyramid-food-raw-data-f9ed6) contiene una tabella ‘food’ con vari tipi di cibi. Ciascun cibo può essere servito in porzioni di dimensione diversa (descritte nella tabella ‘portion’), e ciascun cibo può includere zero o più ingredienti tra quelli riportati nella tabella ‘condiment’. Gli ingredienti inclusi in ciascun cibo son descritti dalla relazione ‘food_condiment’. Si noti che alcuni cibi particolarmente semplici (ad esempio: Whole milk, food_code 11111000) possono comparire sia come cibo, che come ingrediente. Il database è stato estrapolato da un vecchio tema d'esame del corso di "Tecniche di Programmazione", messo a disposizione dai docenti per far esercitare gli studenti. Ritengo che potrebbe essere utilizzato per lo sviluppo dell'applicazione, in quanto abbastanza reale o, quantomeno, verosimile.

Descrizione preliminare degli algoritmi coinvolti

Inizialmente, si procederà con la creazione di un grafo completamente connesso che corrisponde all'elenco dei cibi che non contengono gli ingredienti selezionati. Successivamente si procederà con un algoritmo ricorsivo che deve trovare il cammino massimo, in termini di nodi attraversati, tale che i cibi che lo compongano rispettino le condizioni selezionate dall'utente (al più x calorie, y grassi e z zuccheri aggiunti ) . Infine, si implementerà una simulazione ad eventi che dovrà dare delle stime circa la soddisfazione dei clienti, come già descritto sopra.

Descrizione preliminare delle funzionalità previste per l’applicazione software

L'idea generale dal punto di vista dello I/O con l'utente è la creazione di una interfaccia grafica che contenga 3 combobox dalle quali è possibile selezionare gli ingredienti che non devono essere contenuti nei cibi dell'elenco. Appena l'elenco sarà creato, si stamperà il numero di cibi presenti nell'elenco. Una volta creato il grafo, sarà possibile inserire, attraverso tre caselle di testo il numero massimo di grassi, calorie e zuccheri aggiunti per ogni cibo che costituirà il menù; un bottone avvierà l'algoritmo ricorsivo di ricerca. Una volta trovato il menù, si stamperanno a video i cibi che lo costituiscono. Infine, avendo a disposizione un menù, si potranno inserire il numero di clienti (coperti) e il numero delle postazioni in cucina. Fatto ciò, una volta eseguita la simulazione, si stamperà la percentuale di soddisfazione dei clienti.

fulcorno commented 3 years ago

Il problema generale mi pare valido ed adeguato, ma la sua trasposizione sotto forma di descrizione del progetto è fortemente limitativa. Prendiamo per buono il database FoodPyramid, ma mancano del tutto dei data-set "realistici" che descrivano le disponibilità di cibi nei ristoranti, le richieste dei clienti (anche in modo statistico: quanti clienti solo allergici ad X? quanti ad X+Y?). Inoltre, non mi pare che un grafo sia la struttura dati più adeguata, e certamente un "cammino" su un grafo completo non è la rappresentazione più efficace. Mi pare che questo si configuri come una variante del problema dello "zaino", e quindi la soluzione da trovare sarà un insieme, non un percorso. Infine, non è chiara la qualità da ottimizzare: basta trovare un menu che rispetti le intolleranze ed i max di fattori nutrienti (ce ne saranno milioni di combinazioni diverse), oppure si vuole trovare la combinazione che massimizza qualche metrica?

giogenna16 commented 3 years ago

L'idea venutami in mente utilizzando il database FoodPyramid è quella di ingredienti e menù "standard" (come quelli di una catena di fastfood, ad esempio), quindi non mi ero posto il problema della disponibilità di cibo, supponendola infinita. Le richieste dei clienti dovrebbero essere fornite "al momento dell'ordinazione": creare un menù ad hoc in base alla richiesta di un determinato cliente; nella mia idea non è necessario avere dei dati su quanti clienti siano allergici a x o a y. Grazie ai suoi preziosi consigli, mi sono reso conto che un grafo effettivamente non sia la migliore delle idee per questo problema e anzi complicherebbe inutilmente la situazione; penso possa essere sufficiente l'utilizzo di una struttura dati come una ArrayList o un Set. Per meglio cercare di chiarire l'idea, penso che possa essere d'aiuto un esempio: un cliente è intollerante al latte e alle uova, ad esempio; viene creato un set formato da tutti i cibi che non contengano questi ingredienti. Il cliente può quindi selezionare le calorie, i grassi e gli zuccheri che i cibi che costituiranno il suo menù non devono superare; viene avviata la procedura ricorsiva sul set precedentemente creato che trovi il menù che dovrà "visualizzare il cliente", cioè l'elenco di cibi più grande (in numero di cibi stessi) tale che vengano rispettati tutti i parametri.

Il fatto che ci sia un tempo medio di preparazione per tutti i cibi, dovrebbe implicare che la simulazione non dipenda dal menù, ma solo dal numero di clienti e dalle postazioni.

fulcorno commented 2 years ago

Chiedo scusa per il prolungato silenzio, il semestre mi ha impegnato parecchio. Ti chiederei se sei ancora interessato alla proposta, in modo da poterla definire con precisione e permetterti di iniziare.

giogenna16 commented 2 years ago

Grazie, ma ho già trovato un'alternativa.