Anzahl der halbzufälligen Kombinationen / Permutationen bei einer Reihe von Einschränkungen

8

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)

  1. Warum erhalte ich bei jedem Ausführen des Programms eine andere Anzahl generierter Zuweisungen? Der Datensatz ändert sich zwischen den Läufen nicht.
  2. 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?
  3. 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.

Matthew D.
quelle
Ehrlich gesagt könnten Sie Mathematik versuchen. Dies ist eine ziemlich komplexe Mathematik.
Ryathal
@MatthewD Ihre Frage ist hier in Ordnung, und da Sie bereits eine Antwort gefunden haben, verstehe ich nicht, warum wir sie migrieren sollten. Wenn Sie eine mathematischere Antwort wünschen, können Sie diese erneut in Mathematik veröffentlichen. Stellen Sie jedoch sicher, dass die Frage für die Website geeignet ist (lesen Sie die FAQ für weitere Informationen). Kopieren Sie sie nicht einfach und fügen Sie sie ein. Im Allgemeinen möchten wir nicht dieselbe (oder sehr ähnliche) Frage auf mehreren Websites haben, aber Ihre Frage scheint für beide Websites zum Thema zu gehören. es könnte mit minimalen Änderungen auf Mathematik funktionieren.
Yannis

Antworten:

4

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 ...

  1. 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 designedeinen Fehler markieren .

  2. 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.

  3. 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.

Gemeinschaft
quelle
Danke für die Links! :) (Siehe meine Bearbeitung für das Generieren von Aufgaben)
Matthew D
@MatthewD - sieht so aus, als ob die Zufälligkeit, die Sie sehen / fragen, beabsichtigt und erwartet ist. Ohne Ihre anderen Einschränkungen gibt es 60! Permutationen des Schülerplans, mit dem Sie die Tabellen füllen. Ihre anderen Einschränkungen reduzieren die maximale Anzahl von Permutationen, aber das ist ein ziemlich großer Ausgangspunkt.
Dieser Link, den Sie angegeben haben, schlug "Tabelle mit den am wenigsten unerwünschten Mitgliedern auswählen" vor. Ich habe das getan, und jetzt generiert es konsequent Lösungen, egal wie viele Wochen ich es generieren soll. Ich werde damit spielen, wie ich es implementiert habe, und mir ansehen, wie oft es keine perfekte Übereinstimmung findet, aber bisher sieht es so aus, als würde es funktionieren. Vielen Dank!
Matthew D
Eine der Antworten in den SO-Fragen besagte, dass es sich um ein hartes NP-Problem handelt, das höflich ist für "möglicherweise nicht (vollständig) lösbar". Wenn Sie darauf stoßen, können Sie das Problem einfach betrügen, damit es gelöst wird, dem Berater davon erzählen und vorwärts gehen.