Hintergrund:
In dem Internat, für das ich arbeite, sind ungefähr 60 Schüler. Der Berater bat meinen Kollegen und mich, einen besseren Weg zu finden, um Sitzordnungen für das Abendessen als von Hand zu finden. Er möchte Aufträge für den Rest des Schuljahres. Er bat uns auch, zu versuchen, einige der Probleme zu lösen, von denen er von Studenten und Lehrkräften gehört hat.
Einschränkungen:
- Die meisten Studenten kommen nicht aus den USA. Wenn sie also von Menschen derselben Nationalität umgeben sind (dh am Esstisch), sprechen sie die Sprache, die sie fließend sprechen, anstatt Englisch zu üben.
- Beschwerden werden eingereicht, wenn die Schüler insgesamt "zu oft" an einem bestimmten Tisch gesessen haben.
- oder wenn sie mehr als zweimal hintereinander am selben Tisch sitzen,
- und einige der Schüler verstehen sich nicht, so dass sie nicht zusammen sitzen können.
Eingang:
Zur Laufzeit wird das Programm geliefert mit:
- Eine Gruppe von Menschen,
- Eine Reihe von Tabellen und
- Jeder Tisch hat eine andere Anzahl von Sitzplätzen (Wiederholung ist erlaubt)
Die Größe beider Sätze und die Größe jeder Tabelle ändern sich nicht zwischen den einzelnen Zuweisungen.
Tests:
Ich benutze 18 Personen verschiedener Nationalitäten und 4 Tabellen der Größen 3 bis einschließlich 6. Ich habe Zahlen ausgewählt, die meiner Meinung nach für diesen Datensatz sinnvoll sind:
- Es können nicht mehr als 3 Personen derselben Nationalität gleichzeitig zusammensitzen
- Keine Person kann mehr als viermal an einem Tisch sitzen
Ergebnisse:
Ich habe den Generator ungefähr 15 Mal laufen lassen, ohne die Eingabedaten zu ändern. Jedes Mal werden 6 bis 12 "Wochen" Aufgaben vergeben.
Fragen:
(am wenigsten bis am wichtigsten)
- Warum erhalte ich bei jedem Ausführen des Programms eine andere Anzahl generierter Zuweisungen? Der Datensatz ändert sich zwischen den Läufen nicht.
- Wie finde ich die ...
- Mindestanzahl von Personen derselben Nationalität, die an einem bestimmten Tisch sitzen können,
- Mindestanzahl der Gesamtzeiten, in denen sie an einem bestimmten Tisch sitzen
- Maximierung der Anzahl der generierten Zuordnungen?
- Wie garantiere ich, dass dies tatsächlich die richtigen Zahlen sind?
Bearbeiten:
Jedes Mal, wenn ich eine neue Aufgabe generiere, rufe ich Collections.shuffle(List)
die Liste der Personen auf, um ihre Reihenfolge zufällig zu bestimmen. Ich übergebe dann die Liste der Tabellen und Personen an eine Backtracking-Methode, die auf der Implementierung von Kapilids acht Königinnen auf Github basiert, um Personen Tabellen zuzuweisen.