繁体   English   中英

Dijkstra在Java实现中

[英]Dijkstra in Java implementation

我已经在Java中为项目编写了以下dijkstra实现。 当我运行测试时,如果startNode是0节点,则工作正常,但是如果startNode是另一个节点,则它不是。 有人可以帮我吗? 我会很感激...

这是代码:

    double[][] nodesDistance = new double[graph.getNumOfNodes()][graph.getNumOfNodes()];
    double[] distance = new double[graph.getNumOfNodes()];
    int[] preD = new int [graph.getNumOfNodes()];
    int[] visited = new int [graph.getNumOfNodes()];

    double min;
    int nextNode = 0;

    for (int i = startNode; i < 0; i--) {

        visited[i] = 0; 
        preD[i] = 0;

        for (int j = startNode; j < 0; j--) {

            if (graph.existsEdge(i, j) == true) {

                nodesDistance[i][j] = graph.getEdgeDistance(i, j);
            }else {

                nodesDistance[i][j] = Double.POSITIVE_INFINITY;
            }
        }
    }

    for (int i = startNode; i < graph.getNumOfNodes(); i++) {

        visited[i] = 0; 
        preD[i] = 0;

        for (int j = startNode; j < graph.getNumOfNodes(); j++) {

            if (graph.existsEdge(i, j) == true) {

                nodesDistance[i][j] = graph.getEdgeDistance(i, j);
            }else {

                nodesDistance[i][j] = Double.POSITIVE_INFINITY;
            }
        }
    }
    distance = nodesDistance[startNode];
    distance[startNode] = 0;
    visited[startNode] = 1;

    for (int i = startNode; i < 0; i--) {

        min = 999.0;

        for (int j = startNode; j < 0; j--) {

            if ((min > distance[j]) && (visited[j] != 1)) {

                min = distance[j];
                nextNode = j;
            }
        }

        visited[nextNode] = 1;

        for (int c = startNode; c < 0; c--) {

            if (visited[c] != 1) {

                if (min + nodesDistance[nextNode][c] < distance[c]) {

                    distance[c] = min + nodesDistance[nextNode][c];
                    preD[c] = nextNode;
                }
            }
        }
    }

    for (int i = startNode; i < graph.getNumOfNodes(); i++) {

        min = 999.0;

        for (int j = startNode; j < graph.getNumOfNodes(); j++) {

            if ((min > distance[j]) && (visited[j] != 1)) {

                min = distance[j];
                nextNode = j;
            }
        }

        visited[nextNode] = 1;

        for (int c = startNode; c < graph.getNumOfNodes(); c++) {

            if (visited[c] != 1) {

                if (min + nodesDistance[nextNode][c] < distance[c]) {

                    distance[c] = min + nodesDistance[nextNode][c];
                    preD[c] = nextNode;
                }
            }
        }
    }

    for (int i = 0; i < graph.getNumOfNodes(); i++) {

        result.nodeDistance[i] = distance[i];
        result.nodeThrough[i] = preD[i];
    }

好吧,因为没有人回答您的问题,我想我会尽力的。 我没有早点做的原因是因为我不确定我是否真的可以回答您的问题,因为我无法立即看到问题是由您的代码引起的。

您说您的问题是您的代码无法处理未标识为ID 0的起始节点。我认为我能为您提供帮助的唯一方法是仅说明我将如何实现Dijkstra的算法,因为我的方法似乎有所不同从你的。


步骤1.初始化:

  • 用边缘列表(及其成本/长度)作为节点成员来定义您的节点类,这些边缘列表表示与实例所有者所在节点相邻的节点的连接。 还为每个节点提供一个ID,一个表示是否已访问该节点的属性,一个确定其当前行进距离的属性以及一个表示其最佳路径中先前节点的属性。
  • 用两个节点定义边缘类作为定义其端点的成员。 还给它一个保留其成本/长度的属性。
  • 创建一个节点数组或字典,其中节点ID为键,节点本身为值。 该数组将用作查看已访问或未访问哪个节点的方式。
  • 创建节点的排序数据结构(即二进制堆或优先级队列),将其用作您可以选择访问的相邻(或开放)节点的列表。 确保您的数据结构按从低到高的距离对节点进行排序。
  • 确保正确设置了所有节点和边缘的所有成员(即,已配置所有邻居)。 您应该能够使用针对问题获得的输入来执行此操作。 还要将每个节点中经过的每个距离设置为无穷大(或很高)。 但是,将起始节点距离设置为0,并将其放置在相邻节点的数据结构中。

第2步:搜索:

  • 从相邻节点数据结构中提取出具有最小行进距离(尚未访问)的节点,并将其visisted属性设置为true。
    • 如果当前访问的节点是您要查找的节点,请停止搜索过程。
  • 对于相邻节点中的每个节点,请查看它们的行进距离值是否大于当前节点行进的距离以及当前节点与邻居之间的距离之和。

    • 如果是这种情况,请将邻居距离旅行的值更新为刚计算出的总和,然后将该节点添加到开放节点数据结构中(如果尚未存在)(还要确保该数据结构更新其顺序)。 还将邻居的前任节点设置为当前节点。
    • 如果不是这种情况,则该节点已经被添加到数据结构中,因此您可以保留它。
  • 重复。

步骤3.回溯

  • 这一步很漂亮:只需创建节点列表并将目标节点添加到其中即可。 然后,在上一过程中将目标已设置为前一节点的节点添加。 然后对该节点执行相同操作,并继续执行此操作,直到找到起始节点为止。 然后以首选格式返回列表,并轻拍背面以找到最短路径。

现在,我知道这个解释包含了许多您已经知道的信息,尽管就像我刚开始所说的那样,我不确定您的知识/代码中的问题是否存在。 希望通过阅读本文可以找到所需的内容。 如果没有,我将尝试找到更好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM