2016-11-17 1 views
1

Ich habe einen großen Graph von verbundenen Scheitelpunkten (eine verbundene Komponente) und suche nach einem Pfad, der durch alle geht, aber nie durch einen Scheitelpunkt geht zweimal. Dies ist nicht immer möglich. Zum Beispiel in dem folgenden Beispiel from wikipedia, ist es offensichtlich, dass es keinen Weg gibt, die jede Ecke besucht, wo keine Ecke mehr als einmal besucht:Einen Weg durch eine verbundene Komponente finden, wo jeder Scheitelpunkt genau einmal besucht wird

wikipedia connected component

Aber wenn es wurde leicht verändert, so dass es mehr Kanten (Verbindungen), dann gibt es einige Pfade, die genau einmal durch jeden Knoten gehen können. Ich habe es gezwickt und die Eckpunkte nummeriert einen solchen Weg zu geben:

tweaked connected component

Mein Diagramm wie dieses ist, wo ich weiß, dass es einen möglichen Weg ist. Es ist jedoch ziemlich groß (20.000 Scheitelpunkte mit jeweils zwischen 2 und 11 Kanten). Ich habe Tiefensuche und Breitensuche implementiert, aber das Diagramm ist einfach zu groß, um einen Pfad zu finden (es wird zu lange dauern, um es zu berechnen).


Also meine Frage ist: Gibt es einen anderen Algorithmus, der dieses Problem lösen kann, und zwar effizienter als zuerst in die Tiefe oder Breitensuche?

Es ist ein bisschen wie das Problem des reisenden Verkäufers, nur dass die Städte nur von bestimmten anderen Städten aus erreichbar sind und die Entfernung zwischen diesen gleich ist.

+0

Hat Ihr Graph eine [Brücke] (https://en.wikipedia.org/wiki/Bridge_ (graph_theory))? Ist Ihr Graph [planar] (https://en.wikipedia.org/wiki/Planar_graph)? Versuchen Sie in jedem Fall [approximieren Sie die Baumbreite Ihres Graphen] (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.29.7198&rep=rep1&type=pdf), da eine niedrige Baumbreite effiziente Algorithmen für Ihre Problem. In der Tat –

Antwort

1

Das Problem, das Sie beschreiben, heißt Hamiltonian path problem (ein Hamilton-Pfad ist einer, der einmal und genau einmal durch jeden Knoten geht). Es ist leider bekannt, dass dieses Problem NP -hart ist, daher gibt es keine bekannten polynomiellen Algorithmen zur Lösung dieses Problems. Daher ist es unwahrscheinlich, dass Sie eine Lösung finden, die mit einer einfachen Suche nach der Breite oder einer Tiefensuche effizient arbeitet.

Es gibt einen etwas berühmten dynamischen Programmieralgorithmus zur Lösung dieses Problems. Wenn Sie online nach "Hamiltonian path DP" suchen, sollten Sie einige gute Links zu diesem Thema finden.

Verwandte Themen