我的路徑查找方法有兩個對象,其中包含存儲在數組列表中的標識,名稱,x/y座標和路徑。路徑數據是它可以直接連接到的每個對象的ID。我們的目標是遞歸地調用我的方法,直到它找到使用最短距離的目標,並且當它到達結尾時它將返回true。如何讓我的路徑尋找算法不會相反?
問題: 如果到達節點的距離比當前節點路徑中的其他節點短,則會導致無限循環在兩個節點之間來回跳動。我一直在努力解決這個問題幾個小時,可能會過度思考。任何意見或建議將不勝感激!
算法:
while (!pathfound) {
current = findPath(current, end);
}
public static Place findPath(Place curPlace, Place endPlace) {
ArrayList<Integer> path = curPlace.path;
int id;
double lastdist = 999;
double distance;
Place bestPlace = null;
for (int i = 0; i < path.size(); i++) {
id = curPlace.path.get(i);
distance = distance(getPlace(id), curPlace)
+ distance(getPlace(id), endPlace);
if (distance < lastdist) {
bestPlace = getPlace(id);
}
lastdist = distance;
}
if (result.length() == 0) {
result += bestPlace.name;
} else {
result += ", " + bestPlace.name;
}
System.out.println("CURCITY: " + bestPlace.id);
System.out.println(result);
System.out.println(lastdist);
if (bestPlace == endPlace) {
pathfound = true;
}
return bestPlace;
}
可以忽略的結果,它是保持與所傳遞的節點。如果您還想了解其他任何細節,請詢問。
感謝您花時間幫忙!我可以修改地方,我其實是試圖做一些類似的布爾標誌和一個額外的方法來檢查,如果訪問。我擔心這會導致同樣的問題。我一直收到空指針,因爲bestPlace被設置在循環內部,然後被結果使用。這可能是因爲我的邏輯關閉了,但我不確定如何使用標誌來構造代碼。 – billabrian6
@ billabrian6我也建議使用訪問'地點'的'Set'。 – ggovan
@ billabrian6你還沒有發佈完整的遞歸算法,所以很難給出任何更具體的建議。一般來說,使用標誌方法時,遞歸函數首先檢查標誌,如果它爲假,則將其設置爲true,然後在返回之前再次將其設置爲false。該標誌實質上意味着「現在引用這個地方是否有堆棧上的遞歸函數」。雖然我同意ggovan;參觀場所的「集合」是健壯而清晰的。 –