【问题标题】:Small Modification to Particular Implementation of Dijkstra's Algorithm对 Dijkstra 算法的特定实现的小修改
【发布时间】:2013-04-10 18:18:38
【问题描述】:

在过去的几周里,作为个人项目的一部分(主要是为了测试性能),我一直在使用 Dijkstra 算法的各种实现。我最近遇到了算法的this implementation,我已经测试过它和所有东西。但是,我目前正在尝试修改该实现,因此它需要一个额外的参数来表示目标节点,这意味着我希望算法只从指定的源运行一次到指定的目标,而不是图中的所有其他节点.

我尝试添加第三个targetNode 参数,但在实现中找到的dest 变量是Entry<T> 类型,而我的参数是Node 类型(我编写的一个自定义类),所以我最终得到了一个不兼容的类型错误消息。

是否有可能以某种方式进行此修改?我用另一种实现很容易做到了,但我似乎无法弄清楚这个主要是因为NodeEntry<T> 的不同类型。这不是什么大不了的事,但我想这样做。

谢谢!

编辑:这就是我所做的:

public static <Node> Map<Node, Double> dijkstraFibonacciHeap(DirectedGraph<Node> graph, Node source, Node target) {
    FibonacciHeap<Node> priorityQueue = new FibonacciHeap<>();  
    Map<Node, FibonacciHeap.Entry<Node>> entries = new HashMap<>();
    Map<Node, Double> result = new HashMap<>();

    for (Node node : graph) {
        entries.put(node, priorityQueue.enqueue(node, Double.POSITIVE_INFINITY));
    }


    priorityQueue.decreaseKey(entries.get(source), 0.0);

    while (!priorityQueue.isEmpty()) {

        FibonacciHeap.Entry<Node> curr = priorityQueue.dequeueMin();

        result.put(curr.getValue(), curr.getPriority());

        for (Map.Entry<Node, Double> arc : graph.edgesFrom(curr.getValue()).entrySet()) {

            if (result.containsKey(arc.getKey())) {
                continue;
            }

            double pathCost = curr.getPriority() + arc.getValue();

            // Error occurrs here. 
             target = entries.get(arc.getKey());
            if (pathCost < target.getPriority()) {
                priorityQueue.decreaseKey(target, pathCost);
            }
        } 
    }
    return result;
}

【问题讨论】:

  • 请发布您正在尝试的实际代码 sn-p。
  • 完成。谢谢你提醒我。

标签: java algorithm dijkstra


【解决方案1】:

Dijkstra 算法的工作原理是寻找从源节点到图中每个其他节点的最短路径。当然,一旦它找到到目标节点的最短路径,您就可以提前终止它,但这并不一定会带来很大的加速。

如果您真的想加快最短路径查找速度,“中间相遇”技巧可能会很有用。您同时运行来自源的最短路径和来自接收器的最短路径(将每条边视为其反向);一旦两个搜索都到达同一个节点,您就可以重建最短的源到目标路径。

如果您对图表的外观有很好的猜测,A* 是另一种方法。

我还应该指出,对这段代码的另一个非常非常简单的优化是停止将所有内容包装在对象中。为了将 doubles 包装在 Double 类中以及您的 Nodes 在类中的任何内容中,您付出了很多,包括空间和速度。

【讨论】:

  • 好吧,我想我会坚持原来的想法,照常使用算法。老实说,我只是在尝试进行特定的性能测试,但是由于从源到目标只运行一次算法不会导致很大的加速,所以这并不重要。感谢您的提醒。
猜你喜欢
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2021-04-21
  • 2014-06-23
相关资源
最近更新 更多