簡體   English   中英

獲取從節點到自身的最短路徑的算法—鄰接矩陣— Java

[英]Algorithm to get shortest path from node to itself — Adjacency Matrix — Java

有向圖

有向圖

public int dijkstra(){
    boolean[] visited = new boolean[gSize];

    int src = 1;
    int dest = 1;
    int[] distance = new int[5];
    int[] part = new int[5];
    int min;
    int nextNode = 0;

    for(int i = 0; i < 5; i++)
    {
        visited[i] = false;
        part[i] = 0;

        for(int j = 0; j < 5; j++)
            if(arr[i][j] == -1)
                arr[i][j] = 999; //gives it a high value to ignore
    }

    distance = arr[src];
    distance[src] = 0;

    visited[src] = true;

    for(int i = 0; i < 5; i++)
    {
        min = 999;

        for(int j = 0; j < 5; j++)
            if(min > distance[j] && visited[j] != true)
            {
                min = distance[j];
                nextNode = j;
            }

        visited[nextNode] = true;

        for(int k = 0; k < 5; k++)
            if(visited[k] != true)
                if(min + arr[nextNode][k] < distance[k])
                {
                    distance[k] = min + arr[nextNode][k];
                    part[k] = nextNode;
                }
    }
    return distance[dest];
}

Dijkstra算法可以按預期工作。 但是,它僅在頂點“ x”到頂點“ y”之間起作用。 在我的一生中,我無法弄清楚如何找到從頂點“ x”到頂點“ x”的最短路徑。

例如:

從B到B的最短路徑應返回9(B-> C-> E-> B)。 我是否以為Dijkstra的算法可以解決此問題而采取了錯誤的方法? 謝謝!

您可以搜索最短路徑,該最短路徑從與x相鄰的節點開始,再到x的節點。

最短路徑將是從x到相鄰節點的路徑長度的最短總和加上從此相鄰節點到x的最短路徑長度。

基本上是偽代碼:

// Note: The function neighbors(x) returns the list of neighbors of node x
// The function distance(x, y) returns distance between node x and y
// applying dijkstra algorithm

shortestDistance = 0;
for (Node neighbor : neighbors(x)) {
   currentDistance = distance(x, neighbor) + distance(neighbor, x);
   shortestDistance = min(currentDistance, shortestDistance);
}
return shortestDistance;

對每個起始節點運行Dijkstra,以計算所有對最短路徑。 然后您可以通過遍歷相鄰節點並添加此邊緣權重來計算自最短路徑。在某些情況下,最短路徑將是無窮大,具體取決於節點的入度。

這是一種為非負有向圖找到從一個節點到其自身的最短路徑的棘手方法,將該節點(例如s)分為兩個節點s和s',多余的s'被視為虛擬節點,建立雙向如果s具有自環,則具有相同權重的邊也將所有包含s的邊復制為s',即用s'替換s。 然后問題就變成了找到從s'到s的最短路徑。 您只需稍微修改Dijkstra的算法即可實現此想法。 只需更改初始化。 而不是將d [s] = 0設置為其他所有值都為無窮大,而是為s的每個相鄰節點設置d [u] = w(s,u)。

網格中兩個節點之間的最短路徑可以用Manhattan distance來描述

曼哈頓距離:
網格中兩點之間的距離基於嚴格的水平和/或垂直路徑(即沿着網格線),與對角線或“烏鴉飛過”距離相反。 曼哈頓距離是水平分量和垂直分量的簡單總和,而對角線距離可以通過應用勾股定理來計算。
資源

現在,如果您希望將其應用於查找最短路徑,則應該閱讀Heuristics ,更具體地說是A* Algorithm

也許這個問題和答案可能對您有用: 具有曼哈頓距離啟發式算法的A *算法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM