Sfondo:
Ci sono circa 60 studenti nel collegio per cui lavoro. Il consulente ha chiesto alla mia collega e a me di escogitare un modo migliore per organizzare i posti a sedere per la cena che a mano. Vorrebbe incarichi per il resto dell'anno scolastico. Ci ha anche chiesto di provare a risolvere alcuni dei problemi di cui ha sentito parlare da studenti e docenti.
Vincoli:
- La maggior parte degli studenti non proviene dagli Stati Uniti, quindi quando sono circondati da persone della stessa nazionalità (cioè a tavola), parlano la lingua in cui parlano fluentemente, invece di praticare l'inglese,
- I reclami vengono fatti quando gli studenti si sono seduti a un certo tavolo "troppi" volte nel complesso,
- o se si siedono allo stesso tavolo più di due volte di fila,
- e alcuni studenti non vanno d'accordo, quindi non possono sedersi insieme.
ingresso:
In fase di esecuzione, il programma viene fornito con:
- Un gruppo di persone,
- Un insieme di tabelle e
- Ogni tabella ha un diverso numero di postazioni (è consentita la ripetizione)
La dimensione di entrambi i set e le dimensioni di ogni tabella non cambiano tra ogni assegnazione.
Test:
Sto utilizzando 18 persone di nazionalità diverse e 4 tabelle da 3 a 6, inclusi. Ho scelto numeri che pensavo avesse senso per quel set di dati:
- Non più di 3 persone della stessa nazionalità possono sedersi insieme in un momento
- Nessuno può sedersi a un tavolo più di 4 volte
Risultati:
Ho eseguito il generatore circa 15 volte senza modificare i dati di input. Ogni volta, arriva da 6 a 12 "settimane" di incarichi.
Domande:
(almeno fino al più importante)
- Perché ricevo un numero diverso di assegnazioni generate ogni volta che eseguo il programma? Il set di dati non cambia tra le esecuzioni.
- Come trovo il ...
- numero minimo di persone della stessa nazionalità che possono sedere in una determinata tabella,
- numero minimo di volte complessive in cui si siedono su una data tabella, per tutto
- massimizzare il numero di assegnazioni generate?
- Come garantisco che questi siano effettivamente i numeri corretti?
Modifica:
Ogni volta che creo un nuovo compito, chiamo Collections.shuffle(List)
nell'elenco delle persone per rendere casuale il loro ordine. Passo quindi l'elenco di tabelle e persone a un metodo di backtracking basato su l'implementazione di otto regine di kapilid su github per assegnare le persone ai tavoli.