(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 版權宣告:本文為博主原創文章,轉載請附上博文連結!