簡體   English   中英

Java中二維數組的Dijkstra算法

[英]Dijkstra algorithm for 2D array in Java

這是一個學校項目; 我遇到了很多麻煩,我似乎無法找到一個可以理解的解決方案。

   a b c d e z
 a - 2 3 - - -
 b 2 - - 5 2 -
 c 3 - - - 5 -
 d - 5 - - 1 2
 e - 2 5 1 - 4
 z - - - 2 4 -

這是二維數組。 因此,如果你想找到最短的路徑,它來自a,b,e,d,z = 7,和(a,b)=(b,a) - 它會帶你到行的相鄰的新行路徑

有沒有人可以幫助我為這個例子實現Dijkstra的算法? 我真的很感激。 (我似乎最喜歡數組,地圖和集合讓我感到困惑,列表是可管理的 - 雖然我願意在這一點上研究任何類型的解決方案)

[至少我不只是從網上扯下來源。 我其實想學習這些東西......這真的很難(>。<)]

哦,起點是A,終點是Z.


和大多數人一樣,我沒有發現算法的概念很難 - 我只能看到編碼正確...請幫助嗎?

示例代碼 - 一位朋友幫我解決了這個問題(雖然它充滿了我覺得難以理解的數據結構)我還嘗試過改編來自dreamincode.net/forums/blog/martyr2/index.php的C ++代碼嗎? showentry = 578進入java,但是進展不順利......

import java.util.*;

public class Pathy{

    private static class pathyNode{
        public final String name;
        public Map<pathyNode, Integer> adjacentNodes;

        public pathyNode(String n){
            name = n;
            adjacentNodes = new HashMap<pathyNode, Integer>();
        }

    }

    //instance variables

    //constructors

    //accessors

    //methods
    public static ArrayList<pathyNode> convert(int[][] inMatrix){
        ArrayList<pathyNode> nodeList = new ArrayList<pathyNode>();
        for(int i = 0; i < inMatrix.length; i++){
            nodeList.add(new pathyNode("" + i));
        }
        for(int i = 0; i < inMatrix.length; i++){
            for(int j = 0; j < inMatrix[i].length; j++){
                if(inMatrix[i][j] != -1){
                    nodeList.get(i).adjacentNodes.put(nodeList.get(j),
                            new Integer(inMatrix[i][j]));
                }
            }
        }
        return nodeList;
    }

    public static Map<pathyNode, Integer> Dijkstra(ArrayList<pathyNode> inGraph){
        Set<pathyNode> visited = new HashSet<pathyNode>();
        visited.add(inGraph.get(0));
        pathyNode source = inGraph.get(0);
        Map answer = new TreeMap<pathyNode, Integer>();
        for(pathyNode node : inGraph){
            dijkstraHelper(visited, 0, source, node);
            answer.put(node, dijkstraHelper(visited, 0, source, node));
        }
        return answer;
    }

    private static int dijkstraHelper(Set<pathyNode> visited, int sum, pathyNode start, pathyNode destination){
        Map<pathyNode, Integer> adjacent = new HashMap<pathyNode, Integer>();

        for(pathyNode n : visited){
            for(pathyNode m: n.adjacentNodes.keySet()){
                if(adjacent.containsKey(m)){
                    Integer temp = n.adjacentNodes.get(m);
                    if(temp < adjacent.get(m)){
                        adjacent.put(m, temp);
                    }
                }
                else{
                    adjacent.put(m, n.adjacentNodes.get(m));
                }
            }
        }

        Map<pathyNode, Integer> adjacent2 = new HashMap<pathyNode, Integer>();
        Set<pathyNode> tempSet = adjacent.keySet();
        tempSet.removeAll(visited);
        for(pathyNode n: tempSet){
            adjacent2.put(n, adjacent.get(n));
        }
        adjacent = adjacent2;
        Integer min = new Integer(java.lang.Integer.MAX_VALUE);
        pathyNode minNode = null;

        for(pathyNode n: adjacent.keySet()){
            Integer temp = adjacent.get(n);
            if(temp < min){
                min = temp;
                minNode = n;
            }
        }
        visited.add(minNode);
        sum += min.intValue();
        sum = dijkstraHelper(visited, sum, start, destination);
        return sum;
    }

    //main
    public static void main(String[] args){

        int[][] input = new int[][] { {-1, 2, 3, -1, -1, -1},
                          {2, -1, -1, 5, 2, -1},
                          {3, -1, -1, -1, 5, -1},
                          {-1, 5, -1, -1, 1, 2},
                          {-1, 2, 5, 1, -1, 4},
                          {-1, -1, -1, 2, 4, -1},
                        };
                        //-1 represents an non-existant path

        System.out.println(Dijkstra(convert(input)));
    }
}

您正在調用2D數組的表示形式是圖形的鄰接矩陣表示,您嘗試解決的問題是“單源最短路徑”問題的實例。 Dijkstra的算法旨在解決此類問題。 這可能會有所幫助http://renaud.waldura.com/doc/java/dijkstra/ 從站點下載代碼並閱讀文檔。 基本上你需要編寫類似下面的代碼

    RoutesMap map = map =  new DenseRoutesMap(5);
    map.addDirectRoute(City.A, City.B, 2);
    map.addDirectRoute(City.A, City.C, 3);
    map.addDirectRoute(City.B, City.A, 2);
    map.addDirectRoute(City.B, City.D, 5);
    map.addDirectRoute(City.B, City.D, 2);
    ...
    DijkstraEngine engine = new DijkstraEngine(map);
    int distance = engine.getShortestDistance(City.F);

不知道是否有人仍然對Dijikstra的矩陣表示感興趣,但我一直在考慮在Actionscript中編碼Dijikstra,所以首先要教自己Dijuikstra如何工作。 完成這個並嘗試編碼后,我昨晚才意識到我可以代表節點,並且在矩陣中有距離,例如你在這篇文章的頂部。 我的理論是找到最短路徑將是一件非常簡單的事情。 我還在嘗試確保我糾正。

在矩陣中;

abcdeza - 2 3 - - - b 2 - - 5 2 - c 3 - - - 5 - d - 5 - - 1 2 e - 2 5 1 - 4 z - - - 2 4 -

我開始查看行“a”(因為這是起點)並選擇行中最小的數字為2(在b下)。 所以我把路徑寫成“a - b”,成本為2.然后我轉到b行再次找到b的右邊的最小數字(因為我們已經在b節點。這給了我2個以下因此,路徑現在是“a - b - e”,總成本為4. i然后查看“e”行,規則應該找到“e”列之后出現的最小數字。這會給我“z”,並給出完整的路徑為“a - b - e - z”,總成本為8.但是,記住我昨晚才知道這個,方法需要認識到這一點,同時看着“e”行另一種可能性是以1的成本轉到d列。然后查看d行,得到d行之后的最小數字,這將給出“z”行,成本為2。

因此,正如你所說的那樣,這是一個更好的解決方案,路徑為“a - b - e - d -z”,總成本為7。

好吧我還需要在Actionscript中對此進行編碼,但我的直覺是在Actionscript中編寫代碼非常容易。 害怕我沒有Java經驗,但如果你同意我的方法,那么用Java編寫代碼應該很容易。

保羅

暫無
暫無

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

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