Ich habe diese Frage früher im Stackoverflow gepostet, wo sie als Off-Topic geschlossen wurde. Ich hoffe es überlebt hier.
In unserer Kletterhalle müssen die Routen von Zeit zu Zeit neu eingestellt werden. Es gelten folgende Regeln:
- Wir haben Klettergriffe mit verschiedenen Farben in unterschiedlichen Mengen. - Wenn eine Route in einem Sektor festgelegt ist, darf in diesem Sektor oder in den nahe gelegenen Sektoren keine andere Route mit derselben Farbe festgelegt werden, um Verwirrung zu vermeiden.
- Einige Farbkombinationen müssen in einem Sektor vermieden werden, z. B. Weiß / Grau oder Rot / Rosa.
- Das Ziel ist es, vier Routen in jedem Sektor zu haben. Weniger ist in Ordnung, wenn vier gegen die oben genannten Regeln verstoßen würden.
Ich habe inzwischen zwei verschiedene Ansätze ausprobiert. Das erste war Simuliertes Tempern, bei dem ich die Wand mit einem zufälligen Farbmuster (aber mit einem bestimmten Farbgewicht) initialisierte und für jede Farbkombination eine Schlechtigkeit berechnete . Diese Schlechtigkeit wurde auch für Kombinationen zwischen einem Sektor und seinen Nachbarn berechnet. In jeder Iteration wurde eine zufällig ausgewählte Route aus dem schlechtesten Sektor gegen eine Route aus einem zufällig ausgewählten anderen Sektor ausgetauscht. Dies zeigte eine Art Konvergenz, aber das Ergebnis war nicht verwendbar (dh der resultierende Zustand enthielt Sektoren mit Doppel- oder Dreifachfarben).
Ich näherte mich dann dem Problem von der gegenüberliegenden Seite und begann mit einer leeren Wand. Diesmal hatte jede Farbe eine Konzentration, die von einem Sektor zu den benachbarten Sektoren abfiel. Die Konzentration ähnlicher Farben wurde ebenfalls erhöht, dh ein roter Weg erhöhte die Konzentration von Orange in einem Sektor und in der Nähe. Eine gewichtete zufällige Farbquelle (der Eimer) gab mir die nächste Farbe für die Wand, die in dem Sektor mit der niedrigsten Konzentration dieser Farbe platziert wurde. Wenn eine Konzentration über einem bestimmten Schwellenwert lag, wurde die Farbe nicht hinzugefügt (sondern wieder in den Eimer gegeben). Dies war ein Teilerfolg, da der Ergebnisstatus keine Doppelfarben enthielt - einige Sektoren waren jedoch leer oder enthielten nur eine Farbe.
Also: Was könnte angesichts der oben genannten Regeln ein geeigneter Algorithmus zur Lösung dieses Problems sein? Gerne füge ich bei Bedarf weitere Informationen hinzu.
Bearbeiten 1 - Weitere Informationen:
- Mein Testfall hat 15 Sektoren,
- Jeder Sektor sollte 4 Routen enthalten
- Das echte Fitnessstudio besteht aus 3 Gebäuden mit durchschnittlich jeweils 50 Sektoren
- Einige Sektoren sind um Säulen angeordnet, andere sind durch Dächer verbunden
- Wir haben ungefähr 10 verschiedene Haltefarben
- Die Höhe der Sektoren variiert zwischen 6 (Anfängerabschnitt) und 20 Metern (13 vertikal + 7 Dach), sodass sie unterschiedliche Mengen an Laderäumen verbrauchen. Der Durchschnitt liegt jedoch bei etwa 12 und dies kann als konstant angesehen werden.
- Es gibt eine begrenzte Menge jeder Farbe, die Mengen sind nicht gleich
- Einige Farben sind einfacher, andere schwieriger (dh wir können eine gelbe Route für jede Schwierigkeit erstellen, während die Erstellung einer sehr einfachen orangefarbenen Route für Kinder fast unmöglich ist.)
- Einige Sektoren sind "einfacher", daher sollten einfache Farben dorthin gehen (dies ist optional, unsere Routensetzer können die Dinge in einem weiten Bereich schwieriger oder einfacher machen).
- Wir können mit Sicherheit sagen, welche Farben in einem Sektor oder in benachbarten Sektoren gut zusammenpassen und welche Kombinationen nicht. Es gibt einige Überraschungen wie Weiß und Schwarz (schlechte Kombination): Beide werden grau, während Gummi (Schuhe) oder Kreide (Hände) darauf verbleiben.
- Einige Haltefarben sind Kombinationen wie Violett / Weiß (in einem Streifenmuster).
Edit 2: Einige Fragen zu genetischen Algorithmen
Ich habe jetzt ParadisEO heruntergeladen und kompiliert und sogar meine IDE (ich verwende Code :: Blocks) zum Kompilieren des QuickStart-Beispiels erhalten. ParadisEO bietet genetische Algorithmen mit einem einzigen Ziel sowie einem GA mit mehreren Zielen. GertVdE schlug vor, die Fitness jedes Sektors zu berechnen und die Summe der Fitness aller Sektoren als ein einziges Ziel zu maximieren. Könnte ich auch die Fitness jedes Sektors mit einer GA mit mehreren Zielen maximieren? Das wären rund 50 Ziele.
Außerdem habe ich Probleme mit der Definition einer sinnvollen Crossover-Funktion. Da die maximale Menge jeder Farbe festgelegt ist, kann das Überqueren zu illegalen Zuständen führen. Wenn ich mehr als die zuvor angegebene maximale Menge zulasse, konvergiert das Gesamtmuster möglicherweise zu einer Wiederholung von weniger "störenden" Kombinationen, bei denen die störenden Farben weggeworfen wurden. Andererseits kann ich auch überschüssige Farben wegwerfen, bis das Maximum erreicht ist, wodurch die Crossover-Funktion nicht konservativ wird.
(Ich bin völlig neu in genetischen Algorithmen)