Я пытаюсь найти кратчайший путь, учитывая свойства весов по краям
моя работа на TinkerGraph, и я хочу сделать это в Java.
Гремлин не очень полезен для меня
g.V().has(id1).
repeat(both().simplePath()).
until(has(id2)).as("path").
map(unfold().coalesce(values("weight"),
constant(0)).
sum()).as("cost").
select("cost","path").next().get("path");
это дает мне кратчайший путь без учета свойства веса по краям.
Редакция:
мой пример:
вставлено ребер:
источник, цель
b1, b2
b1, b2
b1, b2
b1, b2
b1, b3
b3, b2
private void add(Vertex source,Vertex target){
if(!checkEdgeExist(graph,source,target))
source.addEdge(target).property(WEIGHT,1.0);
else {
Edge e = getEdgeBetweenTwoVertices(graph,source,target);
source.edges(Direction.OUT).forEachRemaining(edge -> {
if(edge.inVertex().equals(target))
edge.property(WEIGHT,(double)e.property(WEIGHT).value()+1);
});
private static boolean checkEdgeExist(TinkerGraph graph,Vertex source,Vertex target){
return graph.traversal().V(source).outE().filter(p -> p.get().inVertex().equals(target)).hasNext();
}
другими словами, вес ребра обновляется в соответствии с частотой ребра, например, если b1, b2 появились 4 раза, когда ребро будет иметь вес 4. Теперь я хочу, чтобы Дейкстра вернул кратчайший путь с точки зрения вес и не самый короткий с точки зрения ребер. путь (b1, b2) = b1-> b3-> b2