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.
quelle
Antworten:
Aktualisieren:
Mir wurde klar, dass ich Ihre Fragen nicht direkt beantwortet habe. Ich nehme an, es hilft, alle Fragen zu lesen , bevor eine Antwort abgefeuert wird ...
Sie geben nicht an, welchen Algorithmus Sie zum Generieren der Sitzordnungen verwenden. Vermutlich gibt es ein Element der Variabilität / Zufälligkeit, um unterschiedliche Zuordnungen für die Dauer des Terms zu erstellen. Diese Zufälligkeit ist höchstwahrscheinlich der Grund, warum Sie bei jedem Lauf unterschiedliche Ergebnisse erhalten. Ich würde das als
working as designed
einen Fehler markieren .ein. Sie geben den Algorithmus nicht an, daher wissen wir es nicht wirklich. Wir kennen auch nicht die Anzahl für jede Nationalität. Nach einfacher Logik wäre 0 oder 1 das absolute Minimum an einem Tisch, aber ich vermute, dass dies für Sie nicht sehr hilfreich ist. Letztendlich hängt es von der Anzahl der einzelnen Nationalitäten ab und davon, wie sie die anderen Tabellen füllen.
b. Führen Sie Ihr Programm aus, werfen Sie die Ergebnisse in eine Datenbank oder eine Tabelle und lassen Sie sie für Sie zählen. Oder ändern Sie das Programm, um diese Dinge im Auge zu behalten.
c. Die Antwort hier hängt von der Anzahl der einzelnen Nationalitäten und den anderen von Ihnen angegebenen Einschränkungen ab. Die Tabellengröße wirkt sich ebenfalls darauf aus. Die Antwort auf diesen Teil ist eigentlich nur eine Multiplikation der Anzahl möglicher Permutationen. Glücklicherweise (für mich) ist dies eine Seite über Programmierung, nicht über Statistik.
Sie haben hier zwei Probleme zu lösen. Zunächst muss überprüft werden, ob Ihre Einschränkungen die Realität der Situation genau widerspiegeln. Sprechen Sie mit dem Berater, um zu überprüfen, ob Ihre Einschränkungen korrekt sind. Zweitens müssen Sie überprüfen, ob Ihre Ergebnisse Ihren Einschränkungen entsprechen. Schreiben Sie einige Methoden, die die zurückgegebenen Sitzpläne auf die von Ihnen angegebenen Einschränkungen überprüfen. Und / oder überprüfen Sie die Diagramme manuell, um sicherzustellen, dass sie in Ordnung sind.
Diese SO-Frage hat eine ähnliche Frage und legt nahe, dass dies dem Problem der Behälterverpackung oder dem Rucksackproblem entspricht
Diese SO Question Seat-Gäste, die auf priorisierten Parametern basieren, scheinen genau das zu adressieren, wonach Sie suchen.
In dieser SO-Frage werden Probleme erörtert, die der Autor bei der Lösung dieses Problems mithilfe des Bin-Packing-Algorithmus hatte. Ich würde vorschlagen, die Antworten zu lesen , um einen besseren Einblick zu erhalten, wie man sie umgeht.
Und für die obligatorische xkcd-Referenz hier ein Link aus ihren Foren , in dem die Optimierung des Sitzplans und die Verwendung eines modifizierten genetischen Algorithmus zur Lösung des Problems erörtert werden.
Wenn dies ein echtes Szenario ist, dann viel Glück. Und wenn dies nur Hausaufgaben sind, haben Sie mehr als genug Material, um voranzukommen.
quelle