再談啟發式搜索算法

2021-02-15 算法愛好者
(點擊上方公眾號,可快速關注)

作者:July

連結:blog.csdn.net/v_july_v/article/details/6177380

如有好文章投稿,請點擊 → 這裡了解詳情

一、何謂啟發式搜索

啟發式搜索算法有點像廣度優先搜索,不同的是,它會優先順著有啟發性和具有特定信息的節點搜索下去,這些節點可能是到達目標的最好路徑。

我們稱這個過程為最優(best-first)或啟發式搜索。

下面是其基本思想:

假定有一個啟發式(評估)函數ˆf ,可以幫助確定下一個要擴展的最優節點,我們採用一個約定,即ˆf的值小表示找到了好的節點。這個函數基於指定問題域的信息,它是狀態描述的一個實數值函數。

下一個要擴展的節點n是ˆf(n)值最小的節點(假定節點擴展產生一個節點的所有後繼)。

當下一個要擴展的節點是目標節點時過程終止。

我們常常可以為最優搜索指定好的評估函數。

如在8數碼問題中,可以用不正確位置的數字個數作為狀態描述好壞的一個度量:

f(n) = 位置不正確的數字個數(和目標相比)

在搜索過程中採用這個啟發式函數將產生圖9 - 1所示的圖,每個節點的數值是該節點的值。

上述例子表明,在搜索過程中我們需要偏向有利於回溯到早期路徑的搜索(為了避免由於過分的優化試探而陷入「花園小徑」)。

因此我們加了一個「深度因子」給ˆf: ˆf(n)= gˆ(n)+ hˆ(n)  ,gˆ(n)是對圖中節點n的「深度」估計(即從開始節點到n的最短路徑長度),hˆ(n)是對節點n的啟發或評估。

像前面一樣,如果gˆ(n)= 搜索圖中節點n的深度,hˆ(n)=不正確位置的數字個數(和目標相比), 我們可以得到圖9-2。

在這個圖中,把gˆ(n)和hˆ(n)的值寫在每個節點的旁邊,在這種情況下,可以看到搜索相當直接地朝著目標進行(除了用圓圈標註的節點外)。

這些例子提出了兩個重要的問題。

我們如何為最優搜索決定評估函數?

最優搜索的特性是什麼?它能找到到達目標節點的好路徑嗎?

本文主要討論最優搜索的形式表示。作為例子,下面介紹一個包括最優搜索版本的一般圖搜索算法(為了更詳細地了解啟發式搜索,可以參考引用的文章和Pearl寫的書[pearl 1984])。

二、一個通用的圖搜索算法


為了更準確地解釋啟發式搜索過程,這裡提出一個通用的圖搜索算法,它允許各種用戶—偏愛啟發式的或盲目的,進行定製。我把這個算法叫做圖搜索(GRAPHSEARCH)。

下面是(第一個版本)它的定義。

GRAPHSEACH:

生成一個僅包含開始節點n0的搜索樹Tr。把n0放在一個稱為OPEN的有序列表中。

生成一個初始值為空的列表CLOSED。

如果OPEN為空,則失敗並退出。

選出OPEN中的第一個節點,並將它從OPEN中移出,放入CLOSED中。稱該節點為n。

如果n是目標節點,順著Tr中的弧從n回溯到n0找到一條路徑,獲得解決方案,則成功退出(弧在第6步產生)。

擴展節點n,生成n的後繼節點集M。通過在Tr中建立從n到M中每個成員的弧生成n的後繼。

按照任意的模式或啟發式方式對列表OPEN重新排序。

返回步驟3 。

這個算法可用來執行最優搜索、廣度優先搜索或深度優先搜索。在廣度優先搜索中,新節點只要放在OPEN的尾部即可(先進先出, FIFO),節點不用重排。在深度優先搜索中,新節點放在OPEN的開始(後進先出,LIFO)。在最優(也叫啟發式)搜索中,按照節點的啟發式方式來重排OPEN。

三、略談A*搜索算法


用最優搜索算法詳細說明GRAPHSEARCH。最優搜索算法根據函數的增加值,(在上述第7步)重排OPEN中的節點,如8數碼問題。把GRAPHSEACH的這種算法稱為算法A*。

下面將會看到,定義使A*執行廣度搜索或相同代價搜索的函數是可行的。為了確定要用的函數族,必須先介紹一些其他符號。

設g(n) = 從開始節點n0到節點n的一個最小代價路徑的代價。

設h(n) =節點n和目標節點(遍及所有可能的目標節點以及從n到它們的所有可能路徑)之間的最小代價路徑的實際代價。

那麼f(n) = g(n) + h(n)就是從n0到目標節點並且經過節點n的最小代價路徑的代價。

注意f(n0)= h(n0)是從n0到目標節點的一個(不受限的)最小代價路徑的代價。

對每個節點n,設gˆ(n)(深度因子)是由A*發現的到節點n的最小代價路徑的代價,hˆ(n)(啟發因子)是h(n)的某個估計。

在算法A*中,我們用ˆf(n)= gˆ(n)+ hˆ(n)。

注意,如果算法A*中的恆等於0,就成為相同代價搜索。這些定義示例在圖3中。

算法A*:

生成一個只包含開始節點n0的搜索圖G,把n0放在一個叫OPEN的列表上。

生成一個列表CLOSED,它的初始值為空。

如果OPEN為空,則失敗退出。

選擇OPEN上的第一個節點,把它從OPEN中移入CLOSED,稱該節點為n。

如果n是目標節點,順著G中,從n到n0的指針找到一條路徑,獲得解決方案,成功退出(該指針定義了一個搜索樹,在第7步建立)。

擴展節點n,生成其後繼節點集M,在G中,n的祖先不能在M中。在G中安置M的成員,使它們成為n的後繼。

從M的每一個不在G中的成員建立一個指向n的指針(例如,既不在OPEN中,也不在CLOSED中)。把M的這些成員加到OPEN中。對的每一個已在OPEN 中或CLOSED中的成員m,如果到目前為止找到的到達m的最好路徑通過n,就把它的指針指向n。對已在CLOSE中的M的每一個成員,重定向它在G中的每一個後繼,以使它們順著到目前為止發現的最好路徑指向它們的祖先。

按遞增值,重排OPEN(相同最小值可根據搜索樹中的最深節點來解決)。

返回第3步。

在第7步中,如果搜索過程發現一條路逕到達一個節點的代價比現存的路徑代價低,我們就要重定向指向該節點的指針。已經在CLOSED中的節點子孫的重定向保存了後面的搜索結果,但是可能需要指數級的計算代價。因此,第7步常常不會實現。隨著搜索的向前推進,其中有些指針最終將會被重定向。

更多,可參考:關於尋路算法的一些思考(1):A*算法介紹

四、啟發式算法相關問題


4.1、啟發式算法與最短路徑問題

啟發式通常用於資訊充份的搜尋算法,例如最好優先貪婪算

法與A*。

最好優先貪婪算法會為啟發式函數選擇最低代價的節點;

A*則會為g(n) + h(n)選擇最低代價的節點,此g(n)是從起始節點到目前節點的路徑的確實代價。

如果h(n)是可接受的(admissible)意即h(n)未曾付出超過達到目標的代價,則A*一定會找出最佳解。

最能感受到啟發式算法好處的經典問題是n-puzzle。此問題在計算錯誤的拼圖圖形,與計算任兩塊拼圖的曼哈頓距離的總和以及它距離目的有多遠時,使用了本算法。注意,上述兩條件都必須在可接受的範圍內。

曼哈頓距離是一個簡單版本的n-puzzle問題,因為我們假設可以獨立移動一個方塊到我們想要的位置,而暫不考慮會移到其他方塊的問題。 

給我們一群合理的啟發式函式h1(n),h2(n),...,hi(n),而函式h(n) = max{h1(n),h2(n),...,hi(n)}則是個可預測這些函式的啟發式函式。

一個在1993年由A.E. Prieditis寫出的程式ABSOLVER就運用了這些技術,這程式可以自動為問題產生啟發式算法。ABSOLVER為8-puzzle產生的啟發式算法優於任何先前存在的!而且它也發現了第一個有用的解魔術方塊的啟發式程式。

4.2、啟發式算法對運算效能的影響

任何的搜尋問題中,每個節點都有b個選擇以及到達目標的深度d,一個毫無技巧的算法通常都要搜尋bd個節點才能找到答案。

啟發式算法藉由使用某種切割機制降低了分叉率(branching factor)以改進搜尋效率,由b降到較低的b'。分叉率可以用來定義啟發式算法的偏序關係,例如:若在一個n節點的搜尋樹上,h1(n)的分叉率較h2(n)低,則 h1(n) < h2(n)。

啟發式為每個要解決特定問題的搜尋樹的每個節點提供了較低的分叉率,因此它們擁有較佳效率的計算能力。

覺得本文有幫助?請分享給更多人

關注「算法愛好者」,修煉編程內功

相關焦點

  • 網絡規劃中的啟發式算法 --數學化的經驗
    本文為公眾號「小鼴鼠談供應鏈」的第46篇原創文章,轉載需附帶作者和出處,如需加白名單請在後臺留言。
  • 自動駕駛路徑規劃技術-A*啟發式搜索算法
    Dijkstra算法和A*算法的偽代碼如下,可以看到A*算法搜索過程中,增加了對於未來預測的啟發性的Cost,從而指引搜索過程快速收斂。1968年發明的A*算法就是把啟發式方法(heuristic approaches)如BFS,和常規方法如Dijsktra算法結合在一起的算法。有點不同的是,類似BFS的啟發式方法經常給出一個近似解而不是保證最佳解。然而,儘管A*基於無法保證最佳解的啟發式方法,A*卻能保證找到一條最短路徑。1.3 A*算法我將集中討論A*算法。
  • 啟發式算法 --數學化的經驗
    這篇來聊一下,理論上是依賴經驗人人都能做的: 網絡規劃中的啟發式算法。但人人能做不代表結果能做好,啟發式算法有高效的地方,也能把人帶溝裡。先看定義,啟發式算法(heuristic algorithm):一個基於直觀或經驗構造的算法,在可接受的花費(指計算時間和空間)下給出待解決組合優化問題每一個實例的一個可行解,該可行解與最優解的偏離程度一般不能被預計。
  • 【平臺】啟發式算法簡談(一)
    對於那些受大自然的運行規律或者面向具體問題的經驗、規則啟發出來的方法,人們常常稱之為啟發式算法(Heuristic Algorithm)。現在的啟發式算法也不是全部來自然的規律,也有來自人類積累的工作經驗。啟發式算法的發展: 啟發式算法的計算量都比較大,所以啟發式算法伴隨著計算機技術的發展,取得了巨大的成就。
  • blast啟發式算法概述
    啟發式算法是一種來自於經驗的算法,區別於有精確數學推理的算法。
  • 自我代碼提升之啟發式算法(番外篇)
    嚴格來說,啟發式算法並不屬於機器學習領域的方法,其解決的問題也並不是分類和回歸預測,因此本篇屬於該系列番外篇。啟發式算法簡介  在數學建模的經典問題當中,有一種問題是最優化問題,即在給定條件下,給出能夠是的目標實現最優的答案的方法。對預測類問題,如果要確保找出最優的解,那麼可能需要遍歷嘗試所有可能的選擇,在絕大多數場景下,面對指數增長的搜索空間,幾乎是不可取的。
  • 十五個經典算法研究與總結(1)-A*搜索算法
    A*搜尋算法,俗稱A星算法,作為啟發式搜索算法中的一種,這是一種在圖形平面上,有多個節點的路徑,求出最低通過成本的算法。常用於遊戲中的NPC的移動計算,或線上遊戲的BOT的移動計算上。該算法像Dijkstra算法一樣,可以找到一條最短路徑;也像BFS一樣,進行啟發式的搜索。
  • 啟發式算法之遞歸與去遞歸
    啟發式算法之遞歸與去遞歸一個問題的複雜性
  • 論文精選|利用有效的啟發式和迭代貪婪算法實現分布式環境中阻塞流程車間的生產調度
    圖2 NEH2EE啟發式程序PW啟發式算法考慮了機器空閒時間和由處理作業j引起的阻塞時間,以及作業j對下一個作業的影響。本文將PW啟發式對DBFSP的擴展。DPW啟發式算法有兩個步驟:第一步是檢測所有工廠中完工時間最小的工廠,第二步是通過索引函數選擇一個作業附加到檢測到的工廠。其偽代碼如圖3所示:
  • 什麼是啟發式?什麼是產生式?
    一般而言,​機器常常被設定從已知推未知,而人們不時會從未知(假設)推未知,特殊情形下也有從未知推已知的,這些推導中常見的有產生式和啟發式,那麼究竟什麼是產生式和啟發式呢?!例如它常能發現很不錯的解,但也沒辦法證明它不會得到較壞的解;它通常可在合理時間解出答案,但也沒辦法知道它是否每次都可以這樣的速度求解。有時候人們會發現在某些特殊情況下,啟發式算法會得到很壞的答案或效率極差,然而造成那些特殊情況的數據組合,也許永遠不會在現實世界出現。因此現實世界中啟發式算法常用來解決問題。啟發式算法處理許多實際問題時通常可以在合理時間內得到不錯的答案。
  • 元啟發式算法 | 禁忌搜索(Tabu Search)解決TSP問題(Python代碼實現)
    Tabu Search算法實現細節3. 問題與總結1.Tabu Search基本概念禁忌搜索(Tabu Search,TS,以下簡稱TS) 是一種基於鄰域搜索策略的元啟發式算法,由Fred W. Glover 在1986提出[1],並於1989構建[2][3]。應用於各類組合優化問題。
  • | 田淵棟 用深度(強化)學習尋找更好的啟發式搜索策略
    然而,怎樣用深度神經網絡來處理結構化的數據,(如日誌,優化問題的結構化描述,代碼),為一些離散優化問題找到一條替代人力啟發式策略的神經網絡方案,仍然是個未解決的問題。本次直播,田老師將簡要介紹近期他們用強化學習和搜索方法搭配神經網絡,來尋找複雜優化問題的啟發式算法的一些工作。涉及到的應用領域包括:化簡符號表達式、在線事務調度、車輛路徑規化、神經網絡架構搜索,以及從彙編代碼中反編譯出C代碼。
  • A*算法簡介
    啟發式算法(heuristic algorithm),是相對於最優算法的一種算法類型。在許多算法 中,我們最終得到了一個問題的最優解;但在有些算法中,我們通過我們構造的方法, 最終得到了一個在我們的邏輯內認為可行的解,但這個解並不一定是最優解,甚至其相 對於最優解的偏離程度都是我們難以評估的。這種算法被我們稱作啟發式算法。(詳見百度百科「啟發式算法」)    2.
  • 如何進行可用性啟發式評估
    作為用戶體驗專家,你可以自由選擇調研的方法,甚至可以使用超越傳統工具的方法,但是今天,我想回歸簡單,談一談啟發式評估方法。什麼是啟發式評估?「啟發式評估是指安排一組評估人員檢查界面,並判斷其是否與公認的可用性原則相符(「啟發法」)。」
  • A*算法
    A*算法是一個目標導向的算法。
  • 路徑規划算法學習
    一旦變成紅色,就把它的值再改回 Inf。主要就是想對比一下,可以讓大家看到迪傑斯特拉算法的缺點2.1、原理A*(A-Star)算法是一種靜態路網中求解最短路徑最有效的直接搜索方法,也是解決許多搜索問題的有效算法。
  • 模擬退火算法
    現代優化算法是80年代初興起的啟發式算法。
  • 模擬退火算法詳解
    搜索算法包括盲目搜索和啟發式搜索,按照預定的控制策略實行搜索,在搜索控制中獲取的中間信息不用來改進控制搜索,稱為盲目搜索,反之,稱為啟發式搜索。關於「啟發式」有兩種看法:(1)任何有助於找到問題的解,但不能保證找到解的方法均是啟發式方法;(2)有助於加速求解過程和找到較優解的方法是啟發式方法。盲目搜索有深度優先、廣度優先、代價優先、向前、向後、雙向。。。
  • 【AI+波浪補償】利用共生生物搜索(SOS)算法預測海浪高度
    4.1 共生生物搜索(SOS)算法SOS算法是一種基於生物體相互行為模擬的元啟發式算法。該算法從名為生態系統的初始種群開始。在初始生態系統中,在搜索空間中隨機產生一組生物體(決策變量)。作為解決問題的建議,每一個活生物體都表明了適應性的程度具有給定的目標(目標函數的值)。在SOS中,通過模擬生態系統中兩個生物體之間的生物相互作用來生成新的解決方案。
  • 關於尋路算法的一些思考(3):A*算法的實現
    性能A*算法的主循環從一個優先級隊列中讀取節點,分析該節點,然後再向優先級隊列插入新的節點。算法還追蹤哪些節點被訪問過。要提高算法的性能,考慮以下幾方面:能縮減圖的大小嗎?這能減少需處理的節點數目,包括在最終路徑上和不在最終路徑上的節點。