Ich mache einen zufälligen Kartengenerator für ein 4X-Weltraumspiel.
Jeder Knoten im Spiel wird an einer zufälligen (x, y) Koordinate in einem 2D-Gitter platziert. Ein Knoten kann eine oder mehrere bidirektionale Kanten zu einem anderen Knoten haben (der Wurmlöcher darstellt). Alle Knoten müssen mindestens ein Wurmloch haben und alle Knoten müssen zum selben Diagramm gehören.
Idealerweise sollte ein Wurmloch eine maximale Länge nicht überschreiten, und Wurmlöcher sollten sich nach Möglichkeit nicht kreuzen.
Meine naive Implementierung besteht darin, alle Knoten zu durchlaufen und die Knotenverbindung zu den nächsten 3 Knoten herzustellen. Am Ende habe ich jedoch zahlreiche Untergraphen. Was ist eine gute Methode, um die Kanten für die Knoten zu generieren?
quelle
Antworten:
Hier ist eine gute Antwort auf eine ähnliche Frage.
Erstellen Sie zunächst ein verbundenes Diagramm, möglicherweise unter Verwendung eines minimalen Spannbaums wie im obigen Link. Er schlägt vor, zufällige Kantengewichte zu verwenden, um den "minimalen" Baum zufällig zu machen. Dann können Sie zufällig weitere Kanten hinzufügen, sodass dies nicht nur der Mindestbaum ist. Wie genau Sie die zufälligen Kanten hinzufügen, hängt davon ab, welche Art von Diagramm Sie möchten.
Wenn das Problem nur darin besteht, sicherzustellen, dass alle Knoten zum selben Diagramm gehören, können Sie Ihre aktuelle Methode zur Zufallsgenerierung (oder eine andere) verwenden und den Prim-Algorithmus darüber anwenden. Wenn Sie nur minimale Änderungen am Diagramm vornehmen möchten, um sicherzustellen, dass alle Untergraphen verbunden sind, können Sie die Kantenkosten für bereits vorhandene Kanten auf 0 setzen.
quelle
Die Hauptbeschränkungen Ihres Problems sind zweierlei: Erstellen eines 1-verbundenen Diagramms; und Erstellen mit proximalen Verbindungen. Die Antwort von Philip ist zwar etwas wertvoll, spricht jedoch nicht alle Einschränkungen Ihres Problems an
Wenn Sie Punkte in einer Cloud naiv verbinden, laufen Sie Gefahr (und zwar mit einem hohen Risiko), dass diese Bedingungen nicht erfüllt werden.
Sie sehen, das Problem liegt weniger in der Konnektivität als vielmehr in der Nähe dieser Verbindungen. Es ist trivial, jeden Knoten in einem Diagramm mit jedem anderen Knoten zu verbinden, aber es ist etwas schwieriger, nur die Knoten zu verbinden, die am nächsten sind, während die 1-Verbindung des gesamten Diagramms beibehalten wird.
Dies ist, was eine Delaunay-Triangulation in n Dimensionen erzeugt. Der erste Grund für die Verwendung der Delaunay-Triangulation besteht darin, dass beide implizit erfüllt werden. Der zweite Grund ist, dass es viel einfacher ist, von einem solchen Diagramm aus rückwärts zu arbeiten (Kanten und Scheitelpunkte zu subtrahieren, die Sie nicht möchten), als zu versuchen, es auf andere Weise zu erstellen.
Es ist wichtig zu sehen, dass dies ein hierarchischer Prozess ist. Die erste Ebene befasst sich mit der Wurmlochkonnektivität. Die zweite befasst sich mit Entfernungen, die vermutlich mit einem Standard-Schiffsantrieb zurückgelegt werden können. Sie können Delaunay auf einer oder beiden Ebenen anwenden, um Ihre Einschränkungen zu erfüllen.
Wenn Sie dies rein topologisch tun, erhalten Sie Wurmlöcher, die keinen Sinn ergeben, da sie trotz einer hohen Dichte an Sternen dazwischen eine Seite der Galaxie mit einer anderen verbinden können (und möglicherweise sogar auf den direkten Weg des Wurmlochs fallen). Topologie ist keine Topographie; Letzteres ist eine Überlegung, die über Ersteres hinausgeht. Sie beschäftigen sich mit der Nähe und damit der Topographie.
quelle