簡體   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