[英]Weird behavior in A* algorithm with diagonal heuristic
我正在使用A *算法,因此可以使用網絡攝像頭拍攝迷宮的照片,並使用程序來解決它。 結果如下:
當我使用h = 0時,我得到一個很好的解決方案。 使用曼哈頓距離也提供了很好的解決方案。 但是,對角線距離會做一些奇怪的事情,例如我以綠色圈出的圖案。 甚至更奇怪的是,來自另一個迷宮的那個:
我是否錯誤地實現了對角線距離?
public void findHeuristic()
{
int dx = Math.abs(x - MazeBot.goal.x);
int dy = Math.abs(y - MazeBot.goal.y);
h = 10 * (dx + dy) - 6 * Math.min(dx, dy); //diagonal distance
}
我以前從未聽說過“對角線距離”一詞,但我想我明白了,您正在測量要在垂直,水平或對角線上跳躍所需的“跳躍數”。 我無法弄清楚的是為什么您的系數來自何處,除非您想根據移動的長度來加權跳躍。 在這種情況下,您只是開始近似歐幾里得度量。
因此,假設每個“跳躍”的大小相同: dx + dy - Math.min(dx, dy)
但是,注意到對角線作業實際上是sqrt(2)
長度,所以最終得到(dx + dy) - (2 - Math.sqrt(2)) * Math.min(dx, dy)
。 大約是(dx + dy) - 0.5857 * Math.min(dx, dy)
。 我假設您想保留整數,並且不對速度和效率進行除法,並且由於如果輸出按正常數進行縮放,則不會改變啟發式方法的效用,因此您只需乘以所有乘積就可以選擇一些非常接近的系數乘10 * (dx + dy) - 5.857 * Math.min(dx, dy)
約為10 * (dx + dy) - 6 * Math.min(dx, dy)'
。 (您現在擁有的。)
由於您已經創建了歐幾里得度量的更好的近似值,因此您的路徑將趨向於必然要采用指向目標的更多直線。 但是,由於您的近似值實際上是近似值的近似值,因此您最終將得到一些奇怪的結果:
自6 > 5.857
以來Math.min(dx, dy)
越大,您的誤差越大,您6 > 5.857
在使對角線路徑的成本降低了,但隨着距它們的距離越來越近,非對角線路徑開始相對更好地進行測量。 從本質上講,這並不會導致真正不那么理想的路徑,但是我希望它會在遍歷中產生一些難以預測的陌生性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.