在Java 中使用啓發式搜索更快地解決問題

瞭解啓發式搜索領域及其在人工智能上的應用。本文作者展示了他們如何成功用 Java 實現了最廣爲使用的啓發式搜索算法。他們的解決方案利用一個替代的 Java 集合框架,並使用最佳實踐來避免過多的垃圾收集。

通過搜尋可行解決方案空間來解決問題是人工智能中一項名爲狀態空間搜索 的基本技術。 啓發式搜索 是狀態空間搜索的一種形式,利用有關一個問題的知識來更高效地查找解決方案。啓發式搜索在各個領域榮獲衆多殊榮。在本文中,我們將向您介紹啓發式搜索領域,並展示如何利用 Java 編程語言實現 A*,即最廣爲使用的啓發式搜索算法。啓發式搜索算法對計算資源和內存提出了較高的要求。我們還將展示如何避免昂貴的垃圾收集,以及如何利用一個替代的高性能 Java 集合框架 (JCF),通過這些改進 Java 實現。本文的所有代碼都可以從 下載 部分獲得。

啓發式搜索

計算機科學中的許多問題可用一個圖形數據結構表示,其中圖形中的路徑表示潛在的解決方案。查找最優解決方案需要找到一個最短路徑。例如,以自主視頻遊戲角色爲例。角色做出的每個動作都與圖形中的一個邊緣相對應,而且角色的目標是找到最短路徑,與對手角色交手。

深度優先 搜索和廣度優先 搜索等算法是流行的圖形遍歷算法。但它們被視爲非啓發式 算法,而且常常受到它們可以解決的問題規模的嚴格限制。此外,不能保證深度優先搜索能找到最優解決方案(或某些情況下的任何解決方案),可以保證廣度優先搜索僅能在特殊情況下找到最優解決方案。相比之下,啓發式搜索是一種提示性 搜索,利用有關一個問題的知識,以啓發式方式進行編碼,從而更高效地解決問題。啓發式搜索可以解決非啓發式算法無法解決的很多難題。

視頻遊戲尋路是啓發式搜索的一個受歡迎的領域,它還可以解決更復雜的問題。2007 年舉行的無人駕駛汽車比賽 “DARPA 城市挑戰賽” 的優勝者就利用了啓發式搜索來規劃平坦的、直接的可行使路線。啓發式搜索在自然語言處理中也有成功應用,它被用於語音識別中的文本和堆棧解碼句法解析。它在機器人學和生物信息學領域也有應用。與傳統的動態編程方法相比較,使用啓發式搜索可以使用更少的內存更快地解決多序列比對 (Multiple Sequence Alignment, MSA),這是一個經過深入研究的信息學問題。

通過 Java 實現啓發式搜索

Java 編程語言不是實現啓發式搜索的一種受歡迎的選擇,因爲它對內存和計算資源的要求很高。出於性能原因,C/C++ 通常是首選語言。我們將證明 Java 是實現啓發式搜索的一種合適的編程語言。我們首先表明,在解決受歡迎的基準問題集時,A* 的 textbook 實現確實很緩慢,並且會耗盡可用內存。我們通過重訪一些關鍵實現細節和利用替代的 JCF 來解決這些性能問題。

很多這方面的工作都是本文作者合著的一篇學術論文中發表的作品的一個擴展。儘管原作專注於 C/C++  編程,但在這裏,我們展示了適用於 Java 的許多同樣的概念。

廣度優先搜索

熟悉廣度優先搜索(一個共享許多相同概念和術語的更簡單的算法)的實現,將幫助您理解實現啓發式搜索的細節。我們將使用廣度優先搜索的一個以代理爲中心 的視圖。在一個以代理爲中心的視圖中,代理據說處於某種狀態,並且可從該狀態獲取一組適用的操作。應用操作可將代理從其當前狀態轉換到一個新的後繼 狀態。該視圖適用於多種類型的問題。

廣度優先搜索的目標是設計一系列操作,將代理從其初始狀態引導至一個目標狀態。從初始狀態開始,廣度優先搜索首先訪問最近生成的狀態。所有適用的操作在每個訪問狀態都可以得到應用,生成新的狀態,然後該狀態被添加到未訪問狀態列表(也稱爲搜索的前沿)。訪問狀態並生成所有後繼狀態的過程被稱爲擴展 該狀態。

您可以將該搜索過程看作是生成了一個樹:樹的根節點表示初始狀態,子節點由邊緣連接,該邊緣表示用於生成它們的操作。圖 1 顯示該搜索樹的一個圖解。白圈表示搜索前沿的節點。灰圈表示已展開的節點。

圖 1. 二叉樹上的廣度優先搜索順序

搜索樹中的每一個節點表示某種狀態,但兩個獨特的節點可表示同一狀態。例如,搜索樹中處於不同深度的一個節點可以與樹中較高層的另一個節點具有同樣的狀態。這些重複 節點表示在搜索問題中達到同一狀態的兩種不同方式。重複節點可能存在問題,因此必須記住所有受訪節點。

注:相關網站建設技

轉自:http://www.sharetk.com/html/course/seo/8017.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章