2012-04-03 5 views
1

Ich suche nach einer Dijkstra-Algorithmus-Implementierung, die auch die Anzahl der durchlaufenen Knoten berücksichtigt. Ein typischer Dijkstra-Algorithmus berücksichtigt das Gewicht der Kanten, die die Knoten verbinden, während er die kürzeste Route von Knoten A zu Knoten B berechnet. Ich möchte hier einen weiteren Parameter einfügen.Ein Kürzester-Pfad-Algorithmus mit der Mindestanzahl von überfahrenen Knoten

Ich möchte, dass der Algorithmus der Anzahl der durchlaufenen Knoten auch eine gewisse Gewichtung gibt.

So ist die unter bestimmten Werten von A nach B berechnete kürzeste Route möglicherweise nicht die kürzeste Route, sondern die Route mit der geringsten Anzahl der durchlaufenen Knoten.

Irgendwelche Gedanken dazu?

Cheers,
RD

Edit:
Ich entschuldige mich. Ich hätte es besser erklären sollen. Also, sagen wir, die kürzeste Route von
(A, B) ist A -> C -> D -> E -> F -> B umfasst insgesamt 10 Einheiten
Aber ich möchte den Algorithmus zu finden die Route A -> M -> N -> B mit insgesamt 12 Einheiten.
Also, was ich will, ist, in der Lage zu sein, die Anzahl der Knoten, nicht nur die Entfernung der verbundenen Knoten etwas Gewicht zu geben.

+1

Sie können die Gewichtungen ändern, indem Sie jede Kante um eine Konstante erhöhen, was die Verwendung von mehr Kanten (äquiv. Mehr Knoten) in einem Pfad benachteiligt. Grundsätzlich müssen Sie klarer artikulieren, welche Zielfunktion minimiert wird. – hardmath

+1

Sie haben Bedingungen angegeben, die zu vage sind, um wirklich hilfreich zu sein. Das ist eine schlecht formulierte Frage. Ein offensichtlicher Kommentar: Wenn die Art, die Anzahl der berücksichtigten Knoten zu berücksichtigen, additiv ist, dann ziehen Sie in Betracht, Ihren Gewichten einen einheitlichen Betrag hinzuzufügen, damit jeder Knoten eine einheitliche Menge länger braucht. – Kaganar

+0

Es klingt wie Sie sagen: Die Route, die Sie zurückgeben, MUSS die kürzeste Anzahl der durchlaufenen Knoten sein, aber zusätzlich von allen Lösungen, die die kürzeste Anzahl der durchlaufenen Knoten sind, möchten Sie das geringste Kantengewicht? – Jeremy

Antwort

1

Ich gehe hier ein bisschen aus, aber hast du den A * -Algorithmus ausprobiert? Ich habe Ihre Frage vielleicht falsch verstanden, aber es scheint, als wäre A * ein guter Ausgangspunkt für das, was Sie tun möchten.

Check out: http://en.wikipedia.org/wiki/A * _search_algorithm

Einige dort Pseudo-Code, den Sie heraus zu helfen :)

+0

Danke für den Vorschlag, @graysheep. Aber A * ist nicht das, wonach ich wirklich suche. Aber vielen Dank. – Rohitesh

2

Die Art und Weise Sie tun können, dass die Gewichte der Kanten anzupassen, ist immer 1 zu sein, so dass Sie traverse 5 Knoten, und Sie haben eine Entfernung von "5" gegangen. Der Algorithmus wäre an diesem Punkt derselbe, wobei er die Anzahl der durchlaufenen Knoten und nicht die zurückgelegte Entfernung optimiert.

Wenn Sie eine Art von Hybrid wollen, müssen Sie bestimmen, wie wichtig es ist, einen Knoten und die Entfernung zu überqueren. Das Gewicht in Berechnungen verwendet werden, sollten wie etwas aussehen:

weight = node_importance * 1 + (1 - node_importance) * distance

Wo node_importance wäre ein Prozentsatz sein, die Lehren, wie viel Abstand ist ein Faktor, und wie viel minimale Knoten Traversal ist wichtig. Obwohl Sie die Abstände zu einem Durchschnitt von 1 normalisieren müssen.

+0

Einverstanden. Nur, ich würde die Formel als "Gewicht = node_modifier + distance" schreiben (das ist proportional dasselbe wie deins, nur einfacher) – voidengine

+0

Also, was meinst du damit, dass ich ALLE Kanten inkrementieren sollte? Die Kanten werden jedoch als Array gespeichert. Also sollte ich jeden einzelnen Wert bei jeder Iteration der Traversierung erhöhen? – Rohitesh

+0

@pjotr: Könnten Sie mir dabei helfen? Ich konnte nicht wirklich verstehen, was du vorschlägst. – Rohitesh

1

Wenn ich die Frage richtig verstanden habe, dann wäre die beste Analogie, dass verwendet, um den besten Netzwerkpfad zu finden.

In der Netzwerkkommunikation kann ein Pfad nicht nur ausgewählt werden, da er am kürzesten ist, sondern viele Sprungzahlen (Knoten) aufweist, was zu Verzerrungen, Interferenzen und Rauschen aufgrund von Knotenverbindungen führen kann.

Also die beste Weg Berechnung enthält die Minimierung der Funktion von Variablen wie in Ihrem Fall Distance und Hop Count (Knoten).

Sie müssen eine Funktionsgleichung ableiten, die die Entfernung und die Knotenanzahl mit der Qualität in Beziehung setzen kann.

so etwas wie suppose
1 hop count change = 5 unit distance (was bedeutet, dass die Auswirkungen für 5unit distace oder 1 Knoten Änderung gleiche ist)

so den Verlust zu minimieren Sie es in der linearen Gleichung verwenden können.
minimize(distance + hopcount);
wo hopcount als Abstand ausgedrückt werden kann.

+0

Danke Praveen. Ich benutze jetzt die gleiche Logik und es funktioniert. Ich stehe jedoch vor Leistungsproblemen, die ich zu glätten versuche. – Rohitesh

6

Lassen Sie mich demonstrieren, dass das Hinzufügen eines konstanten Werts zu allen Kanten die Route ändern kann, die "kürzest" ist (geringstes Gesamtgewicht der Kanten).

Hier ist die ursprüngliche Grafik (ein Dreieck):

A-------B 
\ 5/
2 \ /2 
    \/
    C 

kürzester Weg von A nach B über C. Nun Konstante 2 bis alle Kanten hinzuzufügen. Der kürzeste Pfad wird stattdessen der einzige Schritt von A direkt nach B (aufgrund der "Strafe", die wir für die Verwendung zusätzlicher Kanten eingeführt haben).

Beachten Sie, dass die Anzahl der verwendeten Kanten (mit Ausnahme des Knotens, von dem aus Sie starten) gleich der Anzahl der besuchten Knoten ist.

+0

Danke. Es funktioniert. Aber jetzt habe ich ein anderes Problem. Das Aktualisieren aller Kanten erhöht nach jeder Iteration die Zeit, die für die Berechnung benötigt wird, um ungefähr das 60-80fache (das ist 6000% bis 8000%), was nicht akzeptabel ist. Ich habe 700+ Knoten, wobei jeder Knoten durchschnittlich 3 Verbindungen zu anderen Knoten hat. Irgendwelche Vorschläge zur Verbesserung der Leistung? – Rohitesh

+1

Warum müssen Sie alle Kanten nach jeder Iteration aktualisieren? Die Aktualisierung würde nur einmal geändert werden, oder? oder Sie müssen die Aktualisierung nicht als separate Operation ausführen. Während Sie den Abstand zwischen zwei Knoten berechnen, fügen Sie ihm die Knotenkosten hinzu. – Praveen

+0

Was @Praveen gesagt hat ... führe das Update einmal auf tatsächliche Kantengewichte durch, oder füge einfach die Konstante in die Dijkstra-Schritte ein, so dass du minimale Gesamtgewichtsabstände zu neuen Knoten mit einer weiteren Kopie dieser Konstante aufzeichnest. Bei der Auswahl der Konstante haben Sie die Kontrolle über das Ausgleichen des minimalen (ursprünglichen) Kantengewichts und das Minimieren der Anzahl der besuchten Knoten (durchquerte Kanten). Eine Nullkonstante entspricht dem ursprünglichen Mindestabstandsproblem. Für eine ausreichend große Konstante minimieren Sie effektiv die Anzahl der besuchten Knoten, da im Rand alle Kanten gleiche Gewichte haben. – hardmath