1. 程式人生 > >(dijkstra)演算法計算兩個地鐵站最短距離演算法

(dijkstra)演算法計算兩個地鐵站最短距離演算法

前言 最新更新了github。歡迎多評論+討論,共同努力。 往後準備更新大資料和微服務的BLOG

由於專案需要計算兩個地鐵站之前最短距離及其線路流程。

引發使用迪傑斯特拉演算法計算帶權值兩點之前最短距離。

網上資料多用的是C++寫的演算法,在這裡用的是Java。實現的方法可以有很多,重要的是把原理理解後用清晰的程式碼實現。

這裡參考了網上的資料:https://blog.csdn.net/wangchsh2008/article/details/46288967 發現類的職責不十分明確並且邏輯稍微混亂進行了改進。並且加入真實距離後會產生BUG

演算法原理 演算法原理我相信搜尋能搜出一大把,我提出較為重要的點並輔以程式碼展示

尋找分析點的所有相鄰點並記錄權值 選取最短距離的鄰點B 迴圈遍歷所有 Core - Code 類職責劃分

DataBuilder 資料初始化 (相鄰點之間距離)(實際中根據情況用TXT或者資料庫讀取初始化資料)

Result 執行結果

Station 站點資訊 ---------------------  作者:匯_  來源:CSDN  原文:https://blog.csdn.net/HuHui_/article/details/83020917  版權宣告:本文為博主原創文章,轉載請附上博文連結!

public static Result calculate(Station star, Station end) {         if (!analysisList.contains(star)) {             analysisList.add(star);         }         if (star.equals(end)){             Result result = new Result();             result.setDistance(0.0D);             result.setEnd(star);             result.setStar(star);             resultMap.put(star, result);             return resultMap.get(star);         }         if (resultMap.isEmpty()) {             List<Station> linkStations = getLinkStations(star);             for (Station station : linkStations) {                 Result result = new Result();                 result.setStar(star);                 result.setEnd(station);                 String key = star.getName() + ":" + station.getName();                 Double distance = DistanceBuilder.getDistance(key);                 result.setDistance(distance);                 result.getPassStations().add(station);                 resultMap.put(station, result);             }         }         Station parent = getNextStation();         if (parent==null){             Result result = new Result();             result.setDistance(0.0D);             result.setStar(star);             result.setEnd(end);             return resultMap.put(end, result);         }         if (parent.equals(end)) {             return resultMap.get(parent);         }         List<Station> childLinkStations = getLinkStations(parent);         for (Station child : childLinkStations) {             if (analysisList.contains(child)) {                 continue;             }             String key = parent.getName() + ":" + child.getName();             Double distance = DistanceBuilder.getDistance(key);             if( parent.getName().equals(child.getName())){                 distance = 0.0D;             }             Double parentDistance = resultMap.get(parent).getDistance();             distance = doubleAdd(distance, parentDistance);             List<Station> parentPassStations = resultMap.get(parent).getPassStations();             Result childResult = resultMap.get(child);             if (childResult!=null){                 if (childResult.getDistance() > distance) {                     childResult.setDistance(distance);                     childResult.getPassStations().clear();                     childResult.getPassStations().addAll(parentPassStations);                     childResult.getPassStations().add(child);                 }             }else {                 childResult = new Result();                 childResult.setDistance(distance);                 childResult.setStar(star);                 childResult.setEnd(child);                 childResult.getPassStations().addAll(parentPassStations);                 childResult.getPassStations().add(child);             }             resultMap.put(child, childResult);         }         analysisList.add(parent);         calculate(star, end);         return resultMap.get(end);     } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 應用場景 ---------------------  作者:匯_  來源:CSDN  原文:https://blog.csdn.net/HuHui_/article/details/83020917  版權宣告:本文為博主原創文章,轉載請附上博文連結!