《人工智能導論》 第5章 搜索求解策略


搜索求解策略

搜索的概念

搜索的基本問題與主要過程

  • 搜索中需要解決的基本問題:
    • 是否一定能找到一個解。
    • 找到的解是否是最佳解。
    • 時間與空間復雜性如何。
    • 是否終止運行或是否會陷入一個死循環
  • 搜索的主要過程
    1. 從初始或目的狀態出發,並將它作為當前狀態。
    2. 掃描操作算子集,將適用當前狀態的一些操作算子作用在其上而得到新的狀態,並建立指向其父結點的指針。
    3. 檢查所生成的新狀態是否滿足結束狀態,如果滿足,則得到解,並可沿着有關指針從結束狀態反向到達開始狀態,給出一解答路徑;否則,將新狀態作為當前狀態,返回第②步再進行搜索。

搜索策略

  • 數據驅動:從初始狀態出發的正向搜索。
  • 目的驅動:從目的狀態出發的逆向搜索。
  • 盲目搜索:在不具有對特定問題的 任何有關信息的條件下,按固定的步驟(依次或隨機調用操作算子)進行的搜索。
  • 啟發式搜索:考慮特定問題領域可應用的知識,動態地確定調用操作算子的步驟,優先選擇較適合的操作算子,盡量減少不必要的搜索,以求 盡快地到達結束狀態。

狀態空間的搜索策略

狀態空間表示法

狀態空間表示法用狀態變量和操作符號來表示系統或問題的符號體系。狀態空間可以用一個四元組表示:

\[(S,\ O,\ S_0\ ,G) \]

其中 \(S\) 是狀態集合。 \(O\) 是操作算子的集合。 \(S_0\) 是包含問題的初始狀態,是 \(S\) 的非空子集。 \(G\) 是包含問題的目的狀態若干具體狀態或滿足某些性質的路徑信息描述。

  • 狀態:表示系統狀態、事實等敘述型知識的一組變量或數組。

    \[Q=[q_1,q_2,\cdots,q_n]^T \]

  • 操作:表示引起狀態變化的過程型知識的一組關系或函數。

    \[F=\{f_1,f_2,\cdots,f_n\} \]

  • 求解路徑:從\(S_0\)節點到\(G\)節點的路徑。

  • 狀態空間的一個解:一個有限的操作算子序列。

    \[S_0\stackrel{O_1}{\longrightarrow}S_1\stackrel{O_2}{\longrightarrow}S_2\stackrel{O_3}{\longrightarrow}\cdots\stackrel{O_k}{\longrightarrow}G \]

    其中 \(O_1···O_K\) 是狀態空間的一個解。

狀態空間的圖描述

狀態空間可用有向圖來描述,圖的結點表示問題的狀態,圖的弧表示狀態之間的關系,就是求解問題的步驟。初始狀態對應於實際問題的已知信息,是圖中的根結點。問題的狀態空間描述中,尋找從一種狀態轉換為另一種狀態的某個操作算子序列就等價於在一個圖中尋找某一路徑。

004

盲目的圖搜索策略

回溯策略

從初始狀態出發,不停地、試探性地尋找路徑, 直到它到達目的或“不可解結點” ,即“死胡同” 為止。回溯策略是遇到不可解結點就回溯到路徑中最近的 父結點上,查看該結點是否還有其他的子結點未被 擴展。若有,則沿這些子結點繼續搜索;如果找到 目標,就成功退出搜索,返回解題路徑。

回溯搜索的算法用三張表來保存狀態空間中的不同性質節點:

  • 路徑狀態表/PS表(path states):保存當前搜索路徑上的狀態。如果找到了目的,PS就是解路徑上的狀態有序集。
  • 新的路徑狀態表/NPS表(new path states):新的路徑狀態表。它包含了等待搜索的狀態,其后裔狀態還未被搜索到,即未被生成擴展 。
  • 不可解狀態表/NSS表(no solvable states):不可解狀態集,列出了找不到解題路徑的狀態。如果在搜索中擴展出的狀態是它的元素,則可立即將之排除,不必沿該狀態繼續搜索。

搜索算法的回溯思想:

  1. 用未處理狀態表(NPS)使算法能返回(回溯)到其中任一狀態。
  2. 用一張“死胡同”狀態表(NSS)來避免算法重新搜索無解的路徑。
  3. 在PS 表中記錄當前搜索路徑的狀態,當滿足目的時可以將它作為結果返回。
  4. 為避免陷入死循環必須對新生成的子狀態進行檢查, 看它是否在該三張表中 。

寬度優先搜索策略

在實際寬度優先搜索時,為了保存狀態空間搜索的軌跡,用到了兩個表:

  • OPEN表:類似NPS表,記錄了已生成但其子狀態待考察的節點。寬度優先搜索算法中OPEN表是隊列結構,其中狀態的排列次序就是搜索的次序。
  • CLOSED表:相當於PS表和NSS表的合並,記錄了已被生成擴展過的狀態。

寬度優先搜索過程:

  1. 把起始節點放到OPEN表中。
  2. 如果OPEN是個空表,則沒有解, 失敗退出,否則繼續。
  3. 把第一個節點(節點 n)從OPEN 表移出,並把它放入CLOSED擴展節點表中。
  4. 考察節點n是否為目標節點。如果是,則求得了問題的解,退出。
  5. 如果節點n不可擴展,則轉第 2 步。
  6. 把 n 的所有子節點放到OPEN表的尾部,並為其配置指向父節點的指針,然后轉第 2 步。

寬度優先算法的改進:

由原來從OPEN表取出后放入CLOSE表前訪問改為擴展其子節點時直接訪問其子節點,可以避免訪問目標節點的左側同級節點。

  1. 把起始節點放到OPEN表中。
  2. 考察該初始節點是否為目標節點。如果是,則求得了問題的解,退出。
  3. 如果OPEN是個空表,則沒有解, 失敗退出,否則繼續。
  4. 把第一個節點(節點 n)從OPEN 表移出,並把它放入CLOSED擴展節點表中。
  5. 如果節點n不可擴展,則轉第 2 步。
  6. 考察節點n的子節點是否為目標節點。如果是,則求得了問題的解,退出。把 n 的所有子節點放到OPEN表的尾部,並為其配置指向父節點的指針,然后轉第 2 步。

深度優先搜索策略

在實際深度優先搜索時,也用到了OPEN表和CLOSED表,不同的是,深度優先搜索算法中OPEN表是堆棧結構。且一般會對深度優先搜索進行深度上的限制,以免深度過深。

有界深度優先搜索算法過程:

  1. 把起始節點S放到OPEN表中。如果此節點為一目標節點,則得到一個解。
  2. 如果OPEN為一空表,則失敗退出。
  3. 把第一個節點(節點n)從OPEN表移到CLOSED表。
  4. 如果節點n的深度等於最大深度dm,則轉向 2 。
  5. 擴展節點n ,產生其全部后裔,並把它們放入OPEN表的首部。如果沒有后裔,則轉向 2 。
  6. 如果后繼節點中有任一個為目標節點,則求得一個解, 成功退出;否則,轉向 2 。

有界深度優先搜索算法的改進:

dm的值很難給出,不能保證找到最優解。可以使用可變的dm。當達了指定的dm仍未發現目標節點,且CLOSED表中仍有待擴展節點時,就將這些節點送回OPEN表,同時增大深度界限dm繼續向下搜索。如此不斷地增大dm,只要問題有解,就一定可以找到它。

啟發式圖搜索策略

啟發式策略

啟發式策略就是利用與問題有關的啟發信息進行搜索。在狀態空間搜索中,啟發式被定義成一系列操作算子,並能從狀態空間中選擇最有希望到達問題解的 路徑。

運用啟發式策略的兩種基本情況:

  • 一個問題由於在問題陳述和數據獲取方面固有的模糊性,可能會使它沒有一個確定的解。
  • 雖然一個問題可能有確定解,但是其狀態空間特別大,搜索中生成擴展的狀態數會隨着搜索 的深度呈指數級增長。

啟發信息和估價函數

在具體求解中,啟發式搜索能夠利用與該問題有關的信息來簡化搜索過程,稱此類信息為啟發信息。啟發信息按運用的方法不同可分為三種:

  • 陳述性啟發信息:一般被用於更准確、更精煉地描述狀態,使問題的狀態空間縮小,如待求問題的特定狀況等屬於此類信息。
  • 過程性啟發信息。一般被用於構造操作算子,使操作算子少而精,如一些規律性知識等屬於此類信息。
  • 控制性啟發信息。它是表示控制策略方面的知識,包括協調整個問題求解過程中所使用的各種處理方法、搜索策略、控制結構等有關的知識。

為提高搜索效率就需要利用上述三種啟發信息作為搜索的輔助性策略。這里主要介紹控制性的啟發信息。利用控制性的啟發信息有兩種極端的情況:

  • 一種是沒有任何控制性知識作為搜索的依據,因而搜索的每一步完全是隨意的,如隨機搜索、寬度搜索、深度搜索等;
  • 另一種是有充分的控制知識作為依據,因而搜索的每一步選擇都是正確的,但這是不現實的。

一般情況介於二者之間。在搜索過程中需要根據這些啟發信息估計各個結點的重要性。

估價函數(Evaluation Function)估計待搜索結點的“有希望”程度,並依次給它們排定次序。一般來說,估計一個結點價值,必須綜合考慮已經付出的代價和將要付出的代價兩方面的因素,因此,估價函數 \(f(n)\)​ 定義為從初始結點經過 n 結點到達目的結的路徑的最小代價估計值,其一般形式是:

\[f(n)=g(n)+h(n) \]

其中,\(g(n)\) 是從初始結點到n結點的實際代價,而 \(h(n)\) 是從n結點到目的結點的最佳路徑的估計代價、因為實際代價\(g(n)\) 可以根據已生成的搜索樹實際計算出來,而估計代價 \(h(n)\) 是對未生成的搜索路徑的作某種經驗性的估計。這種估計來源於對問題解的某些特性的認識,希望依靠這些特性來快速找到問題的解,因此主要是 \(h(n)\) 體現了搜索的啟發性。

A搜索算法

與寬度優先和深度優先搜索算法一樣,啟發式圖搜索法算法也使用OPEN表和CLOSED表記錄狀態信息,不同的是,它既不同於寬度優先所使用的隊列(先進先出),也不同於深度優先所使用的堆棧(先進后出),而是一個按狀態的啟發估價函數值的大小排列的一個表。進入open表的狀態不是簡單地排在隊尾(或隊首),而是根據其估值的大小插入到表中合適的位置,每次從表中優先取出啟發估價函數值最小的狀態加以擴展。

A算法是基於估價函數的一種加權啟發式圖搜索算法,具體步驟如下:

  1. 把附有\(f(S_0)\)的初始結點\(S_0\)。放入OPEN表;
  2. 若OPEN表為空,則搜索失敗,退出;
  3. 移出OPEN表中第一個結點N放入CLOSED表中,並順序編號 n;
  4. 若目標結點把附有\(f(S_0)\)的初始\(S_g=N\),則搜索成功,結束;
  5. \(N\)不可擴展,則轉步驟2;
  6. 擴展\(N\),生成一組附有\(f(x)\)的子結點,對這組子結點作如下處理。
    1. 考察是否有已在OPEN表或CLOSED表中存在的結點。若有則再考察其中有無\(N\)的先輩結點,若有則刪除之,對於其余結點也刪除之,但由於它們又被第二次生成,因此需要考慮是否修改已經存在於OPEN表或CLOSED表中的這些結點及其后裔的返回指針和\(f(x)\)的值。修改原則是:選\(f(x)\)值小的路徑走。
    2. 為其余子結點配上指向\(N\)的返回指針后放入OPEN表中,並對OPEN表按\(f(x)\)值以升序排序,轉步驟2。

A*搜索算法

A* 搜索算法又稱為最佳圖搜索算法,定義\(h^*(n)\)為狀態 n 到目的狀態的最優路徑的代價,則當A搜索算法的啟發函數小於等於\(h^*(n)\)時被稱為 A* 算法。

如果某一問題有解,那么利用 A* 搜索算法對該問題進行搜索則一定能搜索到解,並且一定能搜索到最優的解而結束。 A* 搜索算法有以下幾個特征:

  • 可采納性:對於可解狀態空間圖,如果一個搜索算法在優先步內終止,並能得到最優解,就稱該搜索算法是可采納的。可證明所有 A* 搜索算法都是可采納的,寬度優先搜索是 A* 搜索算法的一個特例,相當於 A* 搜索算法中\(h(n)=0\)\(f(n)=g(n)+0\),它也是可接納的,只是效率太低。
  • 單調性:對所有狀態\(n_i\)\(n_j\),其中\(n_j\)\(n_i\)的后裔,滿足\(h(n_i)-h(n_j)\le cost(n_i,n_j)\),其中\(cost(n_i,n_j)\)是二者之間的實際代價,且目的狀態的啟發函數值為0或\(h(Goal)=0\),則稱該啟發函數是單調的。通俗的說就是在整個搜索空間都是局部可采納的。 一個狀態和任一個子狀態之間的差由該狀態與其子狀態之間的實際代價所限定。
  • 信息性:在兩個 A* 啟發策略的\(h_1\)\(h_2\)中,如果對搜索空間中的任一狀態 n 都有\(h_1(n)\le h_2(n)\),就稱策略 \(h_2\)\(h_1\) 具有更多的信息性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM