2016-12-23 8 views
0

Versuchen, Cytoscape JS für mich zu verhalten, aber einige Usability-Probleme, die ich nicht weiß, ob es mich oder eine Einschränkung der Bibliothek ist.Cytoscape JS - Unterschiedliche Gewichte basierend auf Richtung für Dijkstra's

Das Hauptproblem besteht darin, unterschiedliche Gewichte basierend auf der Richtung verwenden zu wollen. A bis B sollten das Gewicht 3 haben, aber B bis A sollten zum Beispiel das Gewicht 6 haben. Es ist nur eine Kante definiert, da die Dokumente angeben, dass Quelle/Ziel in ungerichteten Diagrammen ignoriert werden.

Ich löste das bisher, indem ich das Gewicht auf dem Knoten selbst speicherte, und ich dachte, ich hätte es in dijkstra's Gewichtungsfunktion ausgearbeitet, indem ich edge.target() untersucht habe, um das gewünschte Gewicht zu erhalten.

Aber ich denke edge.target() scheint nur zu der unidirektionalen Beziehung zu entsprechen, die definiert wird, wenn ich die Kanten einrichte, obwohl ich diriged = false für den Algorithmus angegeben habe. Wenn ich aus der anderen Richtung komme, bekomme ich anscheinend das falsche Gewicht.

Also meine Frage ist .. wie bekomme ich richtig das Knotenziel, das Dijkstra findet Gewicht, innerhalb der Gewichtsfunktion, wo alles, was ich habe, ist das Kantenobjekt? Mein Diagramm hat kreisförmige Pfade, so dass ein Knoten aus zwei Richtungen angefahren werden kann und ein einzelnes Gewicht nicht funktioniert.

Antwort

0

Nun, ich löse dies durch cytoscape.js Bearbeitung und der Modifizierung Dijkstra den eigentlichen Zielknoten in die Gewichtsfunktion zu übergeben:

var weight = weightFn.apply(edge, [ edge, v ]); 

Das ist mir, das Gewicht ergreifen kann, die ich auf dem Knoten selbst speichern.

Ich wäre immer noch interessiert, wenn es eine Eigenschaft im Kantenobjekt gibt, das das eigentliche Ziel liefert, aber die Hauptfrage wurde beantwortet.

+0

Ich bin mir nicht sicher, ob dies wirklich in Dijkstra-Algorithmus funktionieren würde, da der Algorithmus dort ein Gewicht pro Kante vorsieht. Wenn Gewicht pro Richtung ausgedrückt werden kann und der Algorithmus immer noch korrekt arbeitet (d. H. Mit einigen Komponententests als Beispiel), wäre es großartig, dieses Merkmal in der lib durch eine Pull-Anforderung zu haben. Vielen Dank! – maxkfranz

Verwandte Themen