簡體   English   中英

比 A* 更好的啟發式

[英]better heuristic then A*

我在斯坦福大學的 ai-class.com 注冊,並且剛剛在我第一周的講座中學習了關於 a* 算法以及如何比其他搜索算法更好地使用它。

我還展示了我的一位同學在 4x4 滑塊拼圖上實現它,他發表在: http : //george.mitsuoka.org/StanfordAI/slidingBlocks/雖然我非常感謝並感謝 George 實現 A* 並發布了我們娛樂的結果。

我(和他也)想知道是否有任何方法可以使過程更加優化,或者是否有更好的啟發式 A*,例如比“錯位塊數”或“距離總和”的最大值更好的啟發式函數到目標”這會加快速度嗎? 而且,如果有更好的算法來解決此類問題,那么我也想了解它們。

感謝您的幫助,如果出現差異,在對我的個人資料進行評分之前,請讓我有機會升級我的方法,或者即使 req 刪除問題,因為我仍在學習 stackoverflow 的方法。

這取決於您的啟發式函數 例如,如果您有一個完美的啟發式 [ h* ],那么貪心算法 (*) 會產生比 A* 更好的結果,並且仍然是最佳的 [因為您的啟發式是完美的!]。 它將只開發解決方案所需的節點。 不幸的是,您很少有完美的啟發式方法。
(*)貪心算法:總是開發具有最低h值的節點。

但是,如果您的啟發式非常糟糕: h=0 ,那么 A* 實際上是一個BFS 在這種情況下,A* 將開發O(B^d)節點,其中 B 是分支因子,d 是求解所需的步驟數。
在這種情況下,由於您只有一個目標函數,因此雙向搜索(*) 將更有效,因為它只需要開發O(2*B^(d/2))=O(B^(d/2))節點,這比 A* 將開發的要少得多。
雙向搜索:(*)從目標節點和起始節點開始運行BFS,每次迭代從每一邊開始一步,當兩邊有一個公共頂點時,算法結束。

對於一般情況,如果您的啟發式不完美,但並非完全可怕,則 A* 可能會比兩種解決方案都表現得更好。

平均情況的可能優化:您還可以使用 A* 運行雙向搜索:從開始端,您可以使用啟發式運行 A*,並從目標端運行常規 BFS。 它會更快地得到解決方案嗎? 不知道,您可能應該對兩種可能性進行基准測試,然后找出哪個更好。 但是,使用該算法找到的解決方案也將是最優的,例如 BFS 和 A*。

正如您在視頻中了解到的,A* 的性能基於預期成本啟發式的質量。 使您的預期成本啟發法盡可能接近該狀態的實際成本將減少需要擴展的狀態總數。 還有許多變體在某些情況下表現更好,例如在大型狀態空間搜索中面臨硬件限制時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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