Ich habe mich gefragt, ob es bekannte Lösungen für Algorithmen zur Erstellung eines Stundenplans gibt. Grundsätzlich geht es darum, die "Stundenverteilung" (sowohl bei Lehrern als auch bei Klassen) für bestimmte Klassen-Fach-Lehrer-Vereinigungen zu optimieren. Wir können davon ausgehen, dass Klassen, Unterrichtsfächer und Lehrer am Eingang miteinander verbunden sind und dass der Stundenplan zwischen 8.00 und 16.00 Uhr liegen sollte.
Ich denke, dass es dafür wahrscheinlich keinen genauen Algorithmus gibt, aber vielleicht kennt jemand eine gute Annäherung oder Hinweise für die Entwicklung.
Antworten:
Dieses Problem ist NP-vollständig !
Kurz gesagt, man muss alle möglichen Kombinationen untersuchen, um die Liste akzeptabler Lösungen zu finden. Aufgrund der unterschiedlichen Umstände, unter denen das Problem an verschiedenen Schulen auftritt (z. B.: Gibt es Einschränkungen in Bezug auf Klassenräume? Sind einige Klassen manchmal in Untergruppen aufgeteilt? Ist dies ein wöchentlicher Zeitplan? usw.) Es gibt keine bekannte Problemklasse, die allen Planungsproblemen entspricht. Vielleicht hat das Rucksackproblem viele Ähnlichkeitselemente mit diesen Problemen insgesamt.
Eine Bestätigung, dass dies sowohl ein schwieriges Problem ist als auch eines, für das ständig nach einer Lösung gesucht wird, besteht darin, diese (lange) Liste von (meist kommerziellen) Software-Planungstools zu überprüfen
Aufgrund der großen Anzahl der beteiligten Variablen, deren größte Quelle typischerweise die Wünsche des Fakultätsmitglieds sind; -) ..., ist es normalerweise unpraktisch, die Aufzählung aller möglichen Kombinationen in Betracht zu ziehen . Stattdessen müssen wir einen Ansatz wählen, der eine Teilmenge der Problem- / Lösungsräume besucht.
- Genetische Algorithmen , die in einer anderen Antwort zitiert werden, sind (oder scheinen meiner Meinung nach) gut gerüstet, um diese Art der halbgeführten Suche durchzuführen (das Problem besteht darin, eine gute Bewertungsfunktion für die Kandidaten zu finden, die für die nächste Generation aufbewahrt werden sollen)
- Grafik Rewriting- Ansätze sind auch bei dieser Art von kombinatorischen Optimierungsproblemen von Nutzen.
Anstatt mich auf bestimmte Implementierungen eines automatischen Zeitplangenerierungsprogramms zu konzentrieren, möchte ich einige Strategien vorschlagen , die auf der Ebene der Definition des Problems angewendet werden können .
Das allgemeine Grundprinzip ist, dass bei den meisten realen Planungsproblemen einige Kompromisse erforderlich sind, nicht alle Einschränkungen, ausgedrückt und impliziert: vollständig erfüllt werden. Deshalb helfen wir uns durch:
Dies mag kontraintuitiv erscheinen, aber zum Beispiel, indem wir einen anfänglichen, teilweise gefüllten Zeitplan (etwa 30% der Zeitfenster) so bereitstellen, dass alle Einschränkungen vollständig erfüllt werden, und indem wir diesen Teilplan als unveränderlich betrachten, reduzieren wir den Zeit / Raum für die Erstellung von Kandidatenlösungen.
Eine andere Möglichkeit, zusätzliche Einschränkungen zu unterstützen, besteht beispielsweise darin, "künstlich" eine Einschränkung hinzuzufügen, die das Unterrichten einiger Fächer an bestimmten Wochentagen verhindert (wenn dies ein wöchentlicher Zeitplan ist ...). Diese Art von Einschränkungen führt zu einer Reduzierung der Problem- / Lösungsräume, ohne dass typischerweise eine signifikante Anzahl guter Kandidaten ausgeschlossen wird.
Beim Korrekturlesen dieser Antwort stelle ich fest, dass es ziemlich schüchtern ist, eine eindeutige Antwort zu geben, aber dennoch voller praktischer Vorschläge. Ich hoffe diese Hilfe, was schließlich ein "hartes Problem" ist.
quelle
Es ist ein Chaos. ein königliches Durcheinander. Um die bereits sehr vollständigen Antworten zu ergänzen, möchte ich auf meine Familienerfahrung hinweisen. Meine Mutter war Lehrerin und war früher in den Prozess involviert.
Es stellt sich heraus, dass es nicht nur schwierig ist, einen Computer an sich zu haben, sondern auch schwierig, weil es Bedingungen gibt, die für ein vorgebackenes Computerprogramm schwer zu spezifizieren sind. Beispiele:
Wie Sie sehen können, ist das Problem nicht NP-vollständig, sondern NP-verrückt.
Sie haben also einen großen Tisch mit kleinen Kunststoffeinsätzen und bewegen die Einsätze, bis ein zufriedenstellendes Ergebnis erzielt wird. Sie beginnen nie bei Null: Sie beginnen normalerweise mit dem Zeitplan des Vorjahres und nehmen Anpassungen vor.
quelle
Der Internationale Stundenplanwettbewerb 2007 hatte eine Unterrichtsplanung und eine Prüfungsplanung. Viele Forscher nahmen an diesem Wettbewerb teil. Viele Heuristiken und Metaheuristiken wurden ausprobiert, aber am Ende haben die lokalen Suchmetaheuristiken (wie Tabu Search und Simulated Annealing) andere Algorithmen (wie genetische Algorithmen) deutlich übertroffen.
Schauen Sie sich die 2 Open Source Frameworks an, die von einigen der Finalisten verwendet werden:
quelle
Eine meiner Aufgaben in der Halbzeit war die Generierung einer Schultabelle mit genetischen Algorithmen.
Der ganze Tisch ist ein "Organismus". Es gab einige Änderungen und Vorbehalte beim Ansatz der generischen genetischen Algorithmen:
Es wurden Regeln für "illegale Tische" aufgestellt: zwei Klassen im selben Klassenzimmer, ein Lehrer, der zwei Gruppen gleichzeitig unterrichtet usw. Diese Mutationen wurden sofort als tödlich angesehen und ein neuer "Organismus" wurde sofort anstelle des "Verstorbenen" gekeimt. Der erste wurde durch eine Reihe von zufälligen Versuchen generiert, einen legalen (wenn auch sinnlosen) zu erhalten. Die tödliche Mutation wurde nicht zur Anzahl der Mutationen in der Iteration gezählt.
"Exchange" -Mutationen waren viel häufiger als "Modify" -Mutationen. Änderungen waren nur zwischen Teilen des Gens sinnvoll - kein Ersetzen eines Lehrers durch ein Klassenzimmer.
Es wurden kleine Prämien vergeben, um bestimmte 2 Stunden zusammen zu bündeln, dasselbe allgemeine Klassenzimmer nacheinander für dieselbe Gruppe zuzuweisen, um die Arbeitszeit des Lehrers und die Klassenbelastung kontinuierlich zu halten. Es wurden moderate Boni für die Bereitstellung korrekter Klassenzimmer für ein bestimmtes Fach, die Einhaltung der Unterrichtsstunden innerhalb der Anleihen (morgens oder nachmittags) und dergleichen vergeben. Große Boni waren für die Zuweisung der richtigen Anzahl von Fächern, die Arbeitsbelastung für einen Lehrer usw.
Die Lehrer könnten ihre Arbeitslastpläne erstellen: "Dann arbeiten wollen", "Dann arbeiten", "Dann nicht arbeiten", "Dann nicht arbeiten", wobei die richtigen Gewichte zugewiesen werden. Ganze 24 Stunden waren legale Arbeitszeiten, außer dass die Nacht sehr unerwünscht war.
Die Gewichtsfunktion ... oh ja. Die Gewichtsfunktion war ein riesiges, monströses Produkt (wie bei der Multiplikation) von Gewichten, die ausgewählten Merkmalen und Eigenschaften zugewiesen wurden. Es war extrem steil, eine Eigenschaft konnte es leicht um eine Größenordnung nach oben oder unten ändern - und es gab Hunderte oder Tausende von Eigenschaften in einem Organismus. Dies führte zu absolut RIESIGEN Zahlen als Gewichte und als direktes Ergebnis muss eine Bignum-Bibliothek (gmp) verwendet werden, um die Berechnungen durchzuführen. Für einen kleinen Testfall mit etwa 10 Gruppen, 10 Lehrern und 10 Klassenzimmern begann der erste Satz mit einer Note von 10 ^ -200 etwas und endete mit 10 ^ + 300 etwas. Es war völlig ineffizient, wenn es flacher war. Außerdem wuchsen die Werte mit größeren "Schulen" viel weiter.
In Bezug auf die Rechenzeit gab es kaum einen Unterschied zwischen einer kleinen Bevölkerung (100) über einen langen Zeitraum und einer großen Bevölkerung (10.000 +) über weniger Generationen. Die Berechnung über die gleiche Zeit ergab ungefähr die gleiche Qualität.
Die Berechnung (auf einer 1-GHz-CPU) würde ungefähr 1 Stunde dauern, um sich in der Nähe von 10 ^ + 300 zu stabilisieren, wodurch Zeitpläne generiert würden, die für diesen 10x10x10-Testfall recht gut aussahen.
Das Problem kann leicht paralelliert werden, indem eine Netzwerkfunktion bereitgestellt wird, die die besten Proben zwischen Computern austauscht, auf denen die Berechnung ausgeführt wird.
Das resultierende Programm sah nie Tageslicht draußen und brachte mir eine gute Note für das Semester. Es war vielversprechend, aber ich hatte nie genug Motivation, eine grafische Benutzeroberfläche hinzuzufügen und sie für die breite Öffentlichkeit nutzbar zu machen.
quelle
Dieses Problem ist schwieriger als es scheint.
Wie andere angedeutet haben, ist dies ein NP-vollständiges Problem, aber analysieren wir, was das bedeutet.
Grundsätzlich bedeutet dies, dass Sie alle möglichen Kombinationen prüfen müssen.
Aber "gucken" sagt dir nicht viel, was du tun musst.
Das Generieren aller möglichen Kombinationen ist einfach. Es kann eine große Datenmenge erzeugen, aber Sie sollten keine großen Probleme haben, die Konzepte dieses Teils des Problems zu verstehen.
Das zweite Problem besteht darin, zu beurteilen, ob eine bestimmte mögliche Kombination gut, schlecht oder besser ist als die vorherige "gute" Lösung.
Dafür brauchen Sie mehr als nur "ist es eine mögliche Lösung".
Arbeitet zum Beispiel derselbe Lehrer 5 Wochen lang 5 Tage die Woche? Selbst wenn dies eine funktionierende Lösung ist, ist es möglicherweise keine bessere Lösung, als zwischen zwei Personen zu wechseln, sodass jeder Lehrer jeweils eine Woche lang arbeitet. Oh, darüber hast du nicht nachgedacht? Denken Sie daran, dass es sich um Personen handelt, mit denen Sie zu tun haben, und nicht nur um ein Problem bei der Ressourcenzuweisung.
Selbst wenn ein Lehrer 16 Wochen lang Vollzeit arbeiten könnte, könnte dies eine suboptimale Lösung sein, verglichen mit einer Lösung, bei der Sie versuchen, zwischen Lehrern zu wechseln, und diese Art des Ausgleichs ist sehr schwer in Software zu integrieren.
Zusammenfassend lässt sich sagen, dass es für viele, viele Menschen viel wert ist, eine gute Lösung für dieses Problem zu finden. Daher ist es kein leichtes Problem, es zu lösen und zu lösen. Seien Sie bereit, einige Ziele abzustecken, die nicht 100% sind, und nennen Sie sie "gut genug".
quelle
Mein in FET implementierter Zeitplanalgorithmus (Free Timetabling Software, http://lalescu.ro/liviu/fet/ , eine erfolgreiche Anwendung):
Der Algorithmus ist heuristisch. Ich nannte es "rekursives Tauschen".
Eingabe: eine Reihe von Aktivitäten A_1 ... A_n und die Einschränkungen.
Ausgabe: eine Reihe von Zeiten TA_1 ... TA_n (das Zeitfenster jeder Aktivität. Räume sind hier der Einfachheit halber ausgeschlossen). Der Algorithmus muss jede Aktivität unter Berücksichtigung der Einschränkungen in einen Zeitschlitz versetzen. Jedes TA_i liegt zwischen 0 (T_1) und max_time_slots-1 (T_m).
Einschränkungen:
C1) Grundlegend: eine Liste von Aktivitätspaaren, die nicht gleichzeitig ausgeführt werden können (z. B. A_1 und A_2, weil sie denselben Lehrer oder dieselben Schüler haben);
C2) Viele andere Einschränkungen (der Einfachheit halber hier ausgeschlossen).
Der Zeitplanalgorithmus (den ich "rekursives Austauschen" nannte):
Versuchen Sie, jede Aktivität (A_i) nacheinander in einem zulässigen Zeitfenster in der oben angegebenen Reihenfolge zu platzieren. Suchen Sie nach einem verfügbaren Slot (T_j) für A_i, in dem diese Aktivität unter Berücksichtigung der Einschränkungen platziert werden kann. Wenn mehr Slots verfügbar sind, wählen Sie einen zufälligen. Wenn keine verfügbar ist, führen Sie einen rekursiven Austausch durch:
a . Überlegen Sie für jedes Zeitfenster T_j, was passiert, wenn Sie A_i in T_j einfügen. Es wird eine Liste anderer Aktivitäten geben, die mit diesem Schritt nicht übereinstimmen (z. B. befindet sich Aktivität A_k auf demselben Steckplatz T_j und hat denselben Lehrer oder dieselben Schüler wie A_i). Führen Sie für jedes Zeitfenster T_j eine Liste widersprüchlicher Aktivitäten.
b . Wählen Sie einen Steckplatz (T_j) mit der geringsten Anzahl widersprüchlicher Aktivitäten. Angenommen, die Liste der Aktivitäten in diesem Slot enthält 3 Aktivitäten: A_p, A_q, A_r.
c . Platziere A_i bei T_j und mache A_p, A_q, A_r nicht zugeordnet.
d . Versuchen Sie rekursiv, A_p, A_q, A_r (wenn die Rekursionsstufe nicht zu groß ist, sagen wir 14, und wenn die Gesamtzahl der seit Schritt 2 gezählten rekursiven Aufrufe seit Schritt 2 zählt) nicht zu groß auf A_i zu setzen, sagen wir 2 * n). wie in Schritt 2).
e . Wenn A_p, A_q, A_r erfolgreich platziert wurden, kehren Sie mit Erfolg zurück. Andernfalls versuchen Sie es mit anderen Zeitfenstern (fahren Sie mit Schritt 2 b fort) und wählen Sie das nächstbeste Zeitfenster aus.
f . Wenn alle (oder eine angemessene Anzahl) Zeitfenster nicht erfolgreich ausprobiert wurden, kehren Sie ohne Erfolg zurück.
g . Wenn wir uns auf Stufe 0 befinden und A_i nicht erfolgreich platziert wurde, platzieren Sie es wie in Schritt 2 b) und 2 c), jedoch ohne Rekursion. Wir haben jetzt 3 - 1 = 2 weitere Aktivitäten zu platzieren. Weiter mit Schritt 2) (hier werden einige Methoden zur Vermeidung des Radfahrens angewendet).
quelle
UPDATE: aus Kommentaren ... sollte auch Heuristiken haben!
Ich würde mit Prolog gehen ... dann Ruby oder Perl oder etwas anderes verwenden, um Ihre Lösung in eine schönere Form zu bringen.
Ich bin (noch) dabei, etwas Ähnliches wie dieses Problem zu tun, aber den gleichen Weg zu verwenden, den ich gerade erwähnt habe. Prolog (als funktionale Sprache) erleichtert die Lösung von NP-Hard-Problemen wirklich.
quelle
Für eine solche Planung werden häufig genetische Algorithmen verwendet.
Wir haben dieses Beispiel gefunden (Erstellen eines Stundenplans mithilfe eines genetischen Algorithmus), das Ihren Anforderungen ziemlich gut entspricht.
quelle
Hier sind einige Links, die ich gefunden habe:
Schulzeitplan - Listet einige Probleme auf
Ein hybrider genetischer Algorithmus für den Stundenplan
Planen von Dienstprogrammen und Tools
quelle
Dieses Papier beschreibt das Schulstundenplanproblem und ihre Herangehensweise an den Algorithmus ziemlich gut: " Die Entwicklung von SYLLABUS - einem interaktiven, auf Einschränkungen basierenden Planer für Schulen und Hochschulen. " [PDF]
Der Autor teilt mir mit, dass die SYLLABUS-Software hier noch verwendet / entwickelt wird: http://www.scientia.com/uk/
quelle
Ich arbeite an einer weit verbreiteten Scheduling-Engine, die genau dies tut. Ja, es ist NP-vollständig; Die besten Ansätze zielen darauf ab, eine optimale Lösung zu finden. Und natürlich gibt es viele verschiedene Möglichkeiten zu sagen, welche die "beste" Lösung ist - ist es wichtiger, dass Ihre Lehrer mit ihren Stundenplänen zufrieden sind oder dass die Schüler beispielsweise in alle Klassen einsteigen?
Die absolut wichtigste Frage, die Sie frühzeitig lösen müssen, ist, was eine Möglichkeit zur Planung dieses Systems besser macht als eine andere . Das heißt, wenn ich einen Zeitplan habe, in dem Frau Jones mit 8 Mathematik unterrichtet und Herr Smith mit 9 Mathematik unterrichtet, ist das besser oder schlechter als einer, wenn beide mit 10 Mathematik unterrichten? Ist es besser oder schlechter als eins, wenn Frau Jones um 8 Uhr und Herr Jones um 2 Uhr unterrichtet? Warum?
Der wichtigste Rat, den ich hier geben würde, ist, das Problem so weit wie möglich aufzuteilen - vielleicht Kurs für Kurs, vielleicht Lehrer für Lehrer, vielleicht Raum für Raum - und zuerst daran zu arbeiten, das Unterproblem zu lösen. Dort sollten Sie mehrere Lösungen zur Auswahl haben und eine als wahrscheinlichstes Optimum auswählen müssen. Arbeiten Sie dann daran, die "früheren" Unterprobleme so zu gestalten, dass die Bedürfnisse späterer Unterprobleme bei der Bewertung ihrer möglichen Lösungen berücksichtigt werden. Arbeiten Sie dann vielleicht daran, wie Sie aus Situationen herauskommen können, in denen Sie in früheren Unterproblemen nicht vorhersehen können, wenn Sie den Status "Keine gültigen Lösungen" erhalten.
Ein Optimierungsdurchlauf für die lokale Suche wird häufig verwendet, um die Endantwort für bessere Ergebnisse zu "polieren".
Beachten Sie, dass es sich bei der Schulplanung normalerweise um stark ressourcenbeschränkte Systeme handelt. Die Schulen gehen nicht durch das Jahr, wenn 75% des Tages viele leere Räume oder Lehrer in der Lounge sitzen. Ansätze, die in lösungsreichen Umgebungen am besten funktionieren, sind in der Schulplanung nicht unbedingt anwendbar.
quelle
Ich habe kommerzielle Algorithmen sowohl für den Stundenplan als auch für den Stundenplan entwickelt. Zum ersten Mal habe ich Integer-Programmierung verwendet; für die zweite eine Heuristik, die auf der Maximierung einer Zielfunktion durch Auswahl von Slot-Swaps basiert und dem ursprünglich entwickelten manuellen Prozess sehr ähnlich ist. Die wichtigsten Faktoren für die Akzeptanz solcher Lösungen sind die Fähigkeit, alle realen Einschränkungen darzustellen. und für menschliche Zeitnehmer, die nicht in der Lage sind, Möglichkeiten zur Verbesserung der Lösung zu erkennen. Am Ende war der algorithmische Teil im Vergleich zur Vorbereitung der Datenbanken, der Benutzeroberfläche, der Fähigkeit, über Statistiken wie Raumnutzung, Benutzererziehung usw. zu berichten, recht einfach und leicht zu implementieren.
quelle
Im Allgemeinen ist die Einschränkungsprogrammierung ein guter Ansatz für diese Art von Planungsproblemen. Eine Suche nach "Constraint-Programmierung" und -Planung oder "Constraint-basierter Scheduling" sowohl innerhalb des Stapelüberlaufs als auch bei Google wird einige gute Referenzen generieren. Es ist nicht unmöglich - es ist nur ein wenig schwer zu überlegen, wenn traditionelle Optimierungsmethoden wie lineare oder ganzzahlige Optimierung verwendet werden. Eine Ausgabe wäre - gibt es einen Zeitplan, der alle Anforderungen erfüllt? Das an sich ist natürlich hilfreich.
Viel Glück !
quelle
Sie können es mit genetischen Algorithmen aufnehmen, ja. Aber du solltest nicht :). Es kann zu langsam sein und die Parametereinstellung kann zu zeitaufwändig sein usw.
Es gibt erfolgreiche andere Ansätze. Alle in Open Source-Projekten implementiert:
Hier finden Sie eine Liste der Zeitplansoftware
quelle
Ich denke, Sie sollten einen genetischen Algorithmus verwenden, weil:
Die Qualität der Lösung hängt davon ab, wie viel Zeit Sie für die Lösung des Programms aufwenden möchten.
Definition genetischer Algorithmen
Tutorial zu genetischen Algorithmen
Klassenplanungsprojekt mit GA
Schauen Sie sich auch an: eine ähnliche Frage und eine andere
quelle
Ich weiß nicht, dass jemand diesem Code zustimmen wird, aber ich habe diesen Code mit Hilfe meines eigenen Algorithmus entwickelt und arbeite für mich in Ruby. Ich hoffe, es hilft denen, die im folgenden Code nach dem Periodflag, Dayflag, suchen subjectflag und Teacherflag sind der Hash mit der entsprechenden ID und dem Booleschen Flag-Wert. Bei Problemen kontaktieren Sie mich ....... (-_-)
periodflag.each do | k2, v2 |
quelle