[英]Dijkstra algorithm to find shortest path between two nodes in big graph?
[英]How to find the shortest path when not all the nodes are connected using A* algorithm?
我試圖使用A *算法查找從公交車站A到公交車站B的最短路徑/最佳路徑,其中包含車站A的公交路線和包含車站B的公交路線可能沒有公共巴士站。
(我也想以此方式改變出行費用,以使我盡量少乘坐公交車到達目的地)
我的BusRoute類包含一個公交車站的鏈接列表,每個車站都有一個名稱,緯度和經度
我使用NODE類來表示A *中的狀態:
public class Node
{
double gCost;
double hHeuristic;
double f;//f=g+h
Node parent;
BusStation station;//contains lat,lng name
String reached;//is either "Bus" or "Walking" , how i reached this node
int busRouteId;//via which route i reached this station
}
gCost
是2個站點之間的Havesine距離
hHeuristic
是當前測站與目標之間的Havesine距離
我繼續從具有目標站的優先級隊列開始擴展具有最低f值的節點
這是我從當前節點生成所有可能過渡的部分:
ArrayList<Node> posibleMoves=getPosibleMoves(current);
for(Node p:posibleMoves){
if(!visitedNodes.contains(p) ) {
double predictedDistance = calculateHeuristic(p, goal);
double cost;
if (p.getReached().equals("Walking")) {
cost=(10* havesineDistance(current.getLat(), current.getLng(), p.getLat(), p.getLng())) + current.getgCost();
} else { //Reached using a bus
cost=havesineDistance(current.getLat(), current.getLng(), p.getLat(), p.getLng()) + current.getgCost();
}
p.setgCost(cost);
p.sethHeuristic(predictedDistance);
p.setF(cost + predictedDistance);
p.setParent(current);
priorityQueue.add(p);
}
}
}
getPossibleMoves(current)
查找包含該站的所有公交路線,並將每個找到的路線中的下一個站添加到數組列表中。
之后,它將“正在行走”節點添加到不包含該站點的所有其他總線路線中,嘗試以這種方式將路線連接至gheter。 (它找到從每個路線到當前站點的最近站點)
我將步行到達的節點的成本設置為成本的10倍,因為人的速度比公共汽車慢10倍左右。
運行該程序后,我沒有得到期望的結果,它要么更換了太多的公共汽車,要么似乎無緣無故走路。 同樣,在檢查優先級隊列之后,有時它不會輪詢具有最低f值的節點。
這是解決這個問題的好方法嗎? 我想念什么嗎?
大多數編程初學者都低估了實現路徑規划算法的難度。 A *不是一項容易完成的任務,尤其是在與其他約束一起使用時。 它必須定義為中型軟件項目。 我猜想香草A *算法需要500行代碼,而具有優先級隊列和啟發式的OP的擴展變體需要1000行代碼。 在軟件工程中,最好使用UML圖表來描述不同類的交互。 因此,我的建議是從互聯網上下載dia軟件,並在圖表中繪制約10個類來解決A *算法。 對沒有任何UML圖表的路徑規划器進行編程,並希望以一種較小的方法來完成它是一種盲目的嘗試。
這里有兩個用於路徑規划應用的示例性UML圖表: [1] [2]不能開箱即用地使用它們,但是它們顯示了項目應該朝哪個方向發展。 它們有大約10-15個與邊連接的盒子,這些盒子描述了具有許多類和方法的復雜軟件項目。 否則,復雜性將無法處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.