簡體   English   中英

對角啟發式A *算法中的怪異行為

[英]Weird behavior in A* algorithm with diagonal heuristic

我正在使用A *算法,因此可以使用網絡攝像頭拍攝迷宮的照片,並使用程序來解決它。 結果如下: http://i.stack.imgur.com/lbmKg.png

當我使用h = 0時,我得到一個很好的解決方案。 使用曼哈頓距離也提供了很好的解決方案。 但是,對角線距離會做一些奇怪的事情,例如我以綠色圈出的圖案。 甚至更奇怪的是,來自另一個迷宮的那個:

http://i.stack.imgur.com/dTzyr.png

我是否錯誤地實現了對角線距離?

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.

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