簡體   English   中英

當不是所有節點都使用A *算法連接時,如何找到最短路徑?

[英]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.

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