【人工智能 一种现代方法】搜索-复习
智能Agent
(1)理性Agent
Agent:通過傳感器感知環境,通過動作執行器執行動作反饋到環境。
Agent感知序列是agent所收到的所有輸入數據的完整歷史。
Agent的行動選擇取決于到目前時刻為止agent的整個感知序列。
Agent函數通過agent程序實現,agent函數是將感知序列映射到agent的行動。
理性依賴于:定義成功標準的性能度量;Agent對環境的先驗知識;Agent可以完成的行動;Agent截止到此時的感知序列。
理性:產生好的行為,做正確的事。
理性Agent根據目前為止的感知和Agent具有的對環境的先驗知識,選取最大化期望性能度量的動作。
理性的Agent需要收集信息(探索環境)和學習。
(2)PEAS和環境特性
設計智能體的第一步是把任務環境定義完整。
任務環境(PEAS):Performance measure、Environment、Actuators、Sensors(性能度量、環境、執行器、傳感器)。
任務環境特性:
? 完全可觀察/部分可觀察
傳感器能否檢測到與action選擇相關的所有方面?
? 確定性/隨機性
環境的下一個狀態是否完全由當前狀態和agent的執行動作決定。
? 片斷式/序列式
agent的經歷是否可以分為原子片段,并且行動的選擇是否只依賴于片段本身,不依賴于以前片段中的行動。
? 靜態/動態
當agent選擇action時,環境是否會發生變化。
? 離散/連續
區別取決于環境的狀態、處理時間的方式以及agent的感知和動作。
? 單Agent/多Agent
環境是否包含其他agent,這些agent是否在根據當前agent的操作最大化某些性能度量。
? 已知的/未知的
已知的與未知的指的是 Agent(或設計人員)的知識狀態,這里的知識則是指環境的“物理法則”。
(3)狀態表示
原子表示:沒有內部結構。
要素化表示:狀態表示為變量或特征的集合。
結構化表示:狀態包含對象,每個對象有自身的特征值,以及與其他對象的關系。
通過搜索進行問題求解
問題求解智能體:一種基于目標的agent。使用原子表示。
討論的問題具有如下性質:環境是可觀察的、確定的、已知的,問題解是一個行動序列。
(1)搜索問題形式化
初始狀態:Agent的起始時的狀態。
行動:AXTIONS(s),在狀態s下可以執行的動作集合。
轉移模型:對每個動作的描述,RESULT(s,a),在狀態s下執行行動a后達到的狀態;后繼狀態是從一給定狀態出發通過單步行動可以到達的狀態的集合。
初始狀態、行動、轉移模型定義了問題的狀態空間,即從初始狀態可以到達的所有狀態的集合。狀態空間是一個有向網絡或圖,結點表示狀態,弧表示行動,一條路徑是通過行動連接起來的一個狀態序列。
目標測試:確定給定的狀態是不是目標狀態
路徑耗散:為每條路徑賦一個耗散值,即邊加權。采用行動a從狀態s走到狀態s'所需要的單步耗散用c(s,a,s')表示。
問題的解就是從初始狀態到目標狀態的一組行動序列。解的質量由路徑耗散函數度量,所有解里路徑耗散值最小的解即為最優解。
邊緣集:記錄已經生成的但未被擴展的葉結點,frontier。
探索集:記錄每個已被擴展的結點,explored。
搜索策略:如何選擇將要擴展的狀態,frontier中結點的排序。
樹搜索和圖搜索的區別在于,如果新生成的結點在探索集或者邊緣集中,即已經生成過,那圖搜索會丟棄掉這個新生成的結點。
搜索算法的評估:
完備性:當問題有解時,這個算法是否能保證找到解?
最優性:搜索策略是否能找到路徑耗散最小的最優解?
時間復雜度:找到解需要花費多長時間?
空間復雜度:在執行搜索的過程中需要多少內存?
(2)無信息搜索策略(盲目搜索策略)
① BFS: Breadth-first search
寬度優先搜索是簡單搜索策略,先擴展根結點,接著擴展根結點的所有后繼,然后再擴展它們的后繼,frontier是FIFO隊列,依此類推。圖搜索時,目標測試應用于結點被生成時,丟棄已經生成的新生成結點。(如果算法是在選擇要擴展的結點時而不是在結點生成時進行目標檢測,那么在目標被檢測到之前深度d上的其他結點已經被擴展,這時時間復雜度應為O(bd+1)。)
② UCS: Uniform-cost search
一致代價搜索擴展的是路徑消耗g(n)最小的結點n,這可以通過將邊緣結點集組織成按g值排序的隊列來實現。目標檢測應用于結點被選擇擴展時,如果在結點加入frontier之前進行目標測試,將錯失路徑最短的解。圖搜索丟棄路徑消耗高的結點。當所有的單步耗散都相等的時候,一致代價搜索與寬度優先搜索類似,除了算法終止條件,寬度優先搜索在找到解時終止,而一致代價搜索則會檢查目標深度的所有結點看誰的代價最小;這樣,在這種情況下一致代價搜索在深度d無意義地做了更多的工作。
③ DFS: Depth-first search
深度優先搜索總是擴展搜索樹的當前邊緣結點集中最深的結點,LIFO隊列。回溯搜索中是DFS的一種變形,每次只產生一個后繼而不是生成所有后繼;每個被部分擴展的結點要記住下一個要生成的結點。圖搜索時,目標測試應用于結點被生成時,丟棄已經生成的新生成結點。
④ DLS: Depth-limited search
深度受限搜索:對DFS設置界限k,當深度大于k,結點不會被擴展。
⑤ IDS: Iterative deepening search
迭代加深的深度優先搜索:不斷增大深度限制k,首先為0,接著為1,然后為2,依此類推——直到找到目標。當深度界限達到d,即最淺的目標結點所在深度時,就能找到目標結點。
⑥ BS: Bidirectional search
雙向搜索:同時運行兩個搜索,一個從初始狀態向前搜索同時另一個從目標狀態向后搜索——希望它們在中間某點相遇,此時搜索終止。目標測試替換為檢查兩個方向的搜索的邊緣結點集是否相交;如果交集不為空就找到了一個解。
(3)有信息搜索策略(啟發式搜索策略)
最佳優先搜索:結點根據評價函數f(n)選擇擴展,評估值最低的結點被選擇首先進行擴展。
啟發函數:h(n)=結點n到目標結點的最小代價路徑的代價估計值
Uniform Cost:f(n) = g(n)
Greedy Best-First:f(n) = h(n)
A*:f(n) = g(n) + h(n)
①?GBFS:Greedy best-first search
貪婪最佳優先搜索試圖擴展離目標最近的結點,f(n) = h(n)。
②A* 搜索
f(n) = g(n) + h(n)=經過結點n的最小代價解的估計代價。
保障A* 搜索最優性的第一個條件是h(n)是一個可采納啟發式。可采納啟發式是指h(n)從不會過高估計到達目標的代價。因為g(n)是當前路徑到達結點n的實際代價,而f(n)=g(n)+ h(n), f(n)永遠不會超過經過結點n的解的實際代價。
第二個條件,略強于第一個的條件被稱為一致性,只作用于在圖搜索中使用A*算法。如果對于每個結點n和通過任一行動a生成的n的每個后繼結點n',從結點n到達目標的估計代價不大于從n到n'的單步代價與從n'到達目標的估計代價之和:h(n)≤c(n,a,n')+h(n'),則啟發式h(n)是一致的,一致的啟發式函數是可采納的。
A*有如下性質:如果h(n)是可采納的,那么A*的樹搜索版本是最優的;如果h(n)是一致的,那么圖搜索的A*算法是最優的。
?(4)設計可采納的啟發式
- 松弛問題
減少了行動限制的問題稱為松弛問題。松弛問題增加了狀態空間的邊。所以,一個松弛問題的最優解代價是原問題的可采納的啟發式。更進一步,由于得出的啟發式是松弛問題的確切代價,那么它一定遵守三角不等式,因而是一致的。松弛問題的最優路徑的真實代價是原問題的最優路徑的估計代價,是可采納的,也是一致的
多個可采納的啟發式怎么選擇: max
- 從子問題設計模式數據庫
子問題的解代價小于完整問題的解代價,因而是可采納的。模式數據庫:對每個可能的子問題實例存儲解代價。接著,對搜索中遇到的每個完整狀態,在數據庫里查找出相應的子問題,得到其可采納的啟發式。數據庫本身的構造是通過從目標狀態向后搜索并記錄下每個遇到的新模式的代價完成的;搜索的開銷分攤到許多子問題實例上。每個數據庫都能產生一個可采納的啟發式,這 些啟發式可以取最大值的方式組合使用。相加得到的啟發式不是可采納的。
不相交的模式數據庫:兩個子問題的代價之和仍然是求解整個問題的代價的下界。
- 從經驗中學習
利用機器學習算法從大量已知解的問題去學習一個模型。
超越經典搜索
純粹的最優化問題: 根據目標函數找到最佳狀態。不關心到達目標的路徑,只關注解狀態。
- 爬山法(貪婪局部搜索)
- 最陡爬山法:簡單的循環過程,不斷向值增加的方向持續移動。算法在到達一個“峰頂”時終止,即鄰接狀態中沒有比它值更高的。算法不維護搜索樹,因此當前結點的數據結構只需要記錄當前狀態和目標函數值。爬山法不會考慮與當前狀態不相鄰的狀態。
困境:
山脊問題:造成一系列局部極大值,局部極大值是一個比它的每個鄰接結點都高的峰頂,但是比全局最大值要小。
高原問題:一塊平的局部極大值。
- 隨機爬山法在上山移動中隨機地選擇下一步;被選中的概率可能隨著上山移動的陡峭程度不同而不同,這種算法通常比最陡上升算法的收斂速度慢不少,但是在某些狀態空間地形圖上它能找到更好的解。
- 首選爬山法隨機地生成后繼結點直到生成一個優于當前結點的后繼。這個算法在后繼結點很多的時候是個好策略。
- 隨機重啟爬山法:通過隨機生成初始狀態來導引爬山法搜索,直到找到目標。如果每次爬山法搜索成功的概率為p,那么需要重新開始搜索的期望次數為1/p。
- 模擬退火
模擬退火是把爬山法和隨機行走以某種方式結合,和首選爬山法相關,都是隨機產生后繼。只是它沒有選擇最佳移動,選擇的是隨機移動。如果該移動使情況改善,該移動則被接受。否則,算法以某個小于1的概率接受該移動。如果移動導致狀態“變壞”,概率則成指數級下降。這個概率也隨“溫度”T降低而下降:開始T高的時候可能允許“壞的”移動,T越低則越不可能發生。如果調度讓T下降得足夠慢,算法找到全局最優解的概率逼近于1。
- 局部束搜索
它從k個隨機生成的狀態開始,每一步全部k個狀態的所有后繼狀態全部被生成。如果其中有一個是目標狀態,則算法停止。否則,它從整個后繼列表中選擇k個最佳的后繼,重復這個過程。
不同于多次隨機重啟的并行,在隨機重啟搜索中,每個搜索的運行過程是獨立的。局部束搜索中并行的搜索線程之間不是獨立的,有用的信息在并行的搜索線程之間傳遞。
- 遺傳算法
遺傳算法是維護大量狀態種群的隨機爬山搜索。新的狀態通過雜交和變異產生,雜交把來自種群的狀態對結合在一起,是隨機束算法的變形。從k個隨機生成的狀態(初始種群)開始,它通過把兩個父狀態結合來生成后繼,而不是通過修改單一狀態進行。每個狀態都由它的適應度函數給出評估值。對于好的狀態,適應度函數應返回較高的值。被選擇進行繁殖的概率直接與個體的適應度成正比,按照概率隨機地選擇兩對進行配對繁殖,產生雜交的后代,最后后代的每個位置都會按照某個小的獨立概率隨機變異。
只有首選爬山法和模擬退火法可以處理連續的狀態和動作空間。
- 將連續問題離散化。
- 使用梯度進行求解,梯度上升x ← x + α?f(x)或下降法x ← x - α?f(x)。
- 牛頓法,x ← x – g(x)/ g '(x)。
- 約束優化問題。
動作導致的狀態是不確定的,轉移模型RESULT返回一組可能的狀態。
問題的解不再是一個動作序列,而是一個應急規劃/條件規劃。
- 與或搜索樹
與或搜索問題的解是一棵子樹:每個葉子上都有目標結點;在或結點上確定一個動作;在與結點上包含所有可能后果。
- 完全不可觀察
如果Agent感知不到任何信息,稱之為無傳感問題。
信念狀態:整個信念狀態空間包含物理狀態的每個可能集合。如果物理狀態有N個狀態,那么這個無傳感問題有2N個信念狀態。
信念狀態空間搜索問題的形式化:
初始(信念)狀態:物理狀態中所有狀態的集合。
行動ACTIONS(b):假設Agent的信念狀態b={s1,s2},但ACTIONSP (s1)≠ ACTIONSP (s2);Agent就不確定哪個行動是合法的。如果非法行動不影響環境,那么在當前信念狀態b下的任一物理狀態采取行動的并集是安全的。如果非法行動導致世界末日,只允許交集可能更安全。
轉移模型RESULT(b,a):行動后生成新的信念狀態的過程稱為預測。
目標測試GOAL-TEST:Agent需要一個確保生效的規劃,意味著一個信念狀態滿足目標僅當其中所有的物理狀態都滿足GOAL-TEST。
路徑開銷
- 部分可觀察
PERCEPT(s)函數,返回給定狀態的感知信息。如果感知本身是不確定的,則PERCEPT(s)函數返回所有可能感知信息的集合。通過感知確定初始信念狀態。
對于轉移模型,可以將導致從一個信念狀態轉移到另一信念狀態的一個特定行動看做是分為三個階段發生的。RESULT(b,a)返回可能的結果信念狀態構成的集合。預測給定信念狀態b的活動a,預測的信念狀態為b’;觀察預測階段確定預測信念狀態里可觀察到的感知o的集合;更新階段對于每個可能的感知信息確定可能得到的信念狀態。
?(5)脫機與聯機
脫機搜索:計算出完整的方案(然后“閉著眼睛”執行該方案),脫機搜索只涉及計算過程,不涉及動作執行過程。
聯機搜索:計算和動作執行交替進行。先采取某個行動,然后觀察環境變化并且計算出下一行動。
Agent不清楚自身的狀態和行動的結果,這時的Agent面臨聯機搜索問題。
脫機算法在狀態空間的一部分擴展一個結點后,能馬上跳到狀態空間的另一部分擴展另一個結點。聯機算法只會擴展它實際占據的結點。為了避免遍歷整個搜索樹去擴展下一個結點,按照局部順序擴展結點看來更好一些,深度優先搜索具有這個性質——聯機深度優先搜索。?
博弈搜索
S0:初始狀態,定義開始時的格局。
PLAYER(s):定義狀態s下該誰行動。
ACTIONS(s):定義狀態s下的合法移動集合。
RESULT(s,a):轉移模型,定義行動的結果。
TERMINAL-TEST(s):終止測試,游戲結束返回真,否則返回假。游戲結束的狀態稱為終止狀態。
UTILITY(s,p):效用函數,定義游戲者p在終止狀態s下的數值。零和博弈是指所有棋手的收益之和在每個棋局實例中都相同。
由初始狀態、ACTIONS函數和RESULT函數確定;結點是狀態;邊是移動
從游戲結果回溯,Max選擇讓效用最大的行動,Min選擇效用最小的行動。極小極大算法對博弈樹執行完整的深度優先探索。如果樹的最大深度是m,在每個結點合法的行棋有b個,時間復雜度是O(bm)。一次性生成所有的后繼的算法,空間復雜度是O(bm),而每次生成一個后繼的算法,空間復雜度是O(m)。
若博弈有三個人A,B和C參與,則每個結點都與一個向量〈vA,vB,vC〉相關聯。對于終止狀態,這個向量代表著從每個人角度出發得到的狀態效用值;最簡單的實現方法就是讓函數UTILITY返回一個效用值向量。
a = 到目前為止路徑上MAX獲得的最佳值(即極大值)
β = 到目前為止路徑上MIN獲得的最佳值(即極小值)
v = 當前結點所搜索過的子結點中的最佳值
在min結點,若當前搜索過的子結點的最小值v小于等于a,則剪去該min的其余子結點,返回v在max結點,若當前搜索過的子結點的最大值v大于等β,則剪去該max的其余子結點,返回v。
a剪枝:如果一個MIN節點的β值小于或等于它的某一個MAX祖先節點的a值,則剪枝發生在該MIN節點之下:終止這個MIN節點以下的搜索過程。這個MIN節點最終的倒推值就確定為這個β值。
β剪枝:如果一個MAX節點的a值大于或者等于它的某一個MIN祖先節點的β值,則剪枝發生在該MAX節點之下.終止這個MAX節點以下的搜索過程。該MAX節點的最終返回值可以置成它的a值。
行期排序:設博弈樹的分支因子都為b,搜索深度為m。最壞情況:需要檢查O(bm)個結點,退化成Minimax算法;最好情況:如果MAX結點的MIN子結點按回傳值的降序排列,MIN結點的MAX子結點按回傳值的升序排列,只需檢查O(bm/2) 個結點;一般情況,如果結點隨機排序,平均需要檢查O(b3m/4)個結點。
- 用估計棋局效用值的啟發式評估函數EVAL取代效用函數Utility,用截斷測試取代終止測試。函數EVAL(s):對于給定的棋局s,返回對博弈的期望效用值的估計。EVAL(s) > 0:有利于MAX,值越大越對MAX有利;EVAL(s) < 0:有利于MIN,值越小越對MIN有利;EVAL(s) = 0:中立。截斷方式:設置固定的深度限制,深度值設定必須符合游戲規則許可的時間;迭代加深,直到時間用完。
- 向前剪枝的一種方法是柱搜索:在每一層,只考慮最好的n步行棋可能,并不是考慮所有行棋招數,但無法保證最佳的行棋不被裁剪掉。
帶機會結點的博弈樹:把確定性博弈中的極小極大值一般化為期望極小極大值。期望值是所有可能結果的平均值。
約束滿足問題
(1)形式化:
變量集合:X={X1 , …, Xn }
值域集合:D={D1 , …, Dn }
約束集合:C
在CSP中,算法可以進行約束傳播,縮小其他變量值域,也可以搜索,選擇變量賦值。約束傳播與搜索可以交替進行,也可以將約束傳播作為搜索前的預處理步驟。
局部相容性:增強約束圖中各部分局部相容性會導致不相容的結點取值被刪除。
結點相容:如果單個變量的值域中的所有取值滿足它的一元約束,就稱此變量是結點相容的。如果網絡中每個變量都是結點相容的,則此網絡是結點相容的。
弧相容:若對Xi的每個賦值,Xj都存在某個取值滿足弧(Xi,Xj)的二元約束,則稱Xi關于Xj是弧相容的。如果每個變量關于其它變量都是弧相容的,則稱該網絡是弧相容的。
路徑相容:對{Xi, Xj}的每一個相容賦值{Xi=a, Xj=b},Xm都有合適的取值同時使得{Xi,Xm}和{Xm,Xj}是相容的,則稱集合{Xi,Xj}關于Xm是路徑相容的。
k相容:給定k個變量{x1,...,xk},對于{x1,...,xk-1}的每一個相容賦值,xk都有合適的取值使得{x1,xk},...,{xk-1 ,xk }是相容的,則稱{x1,...,xk-1 }關于xk是k相容的。
全局約束可涉及任意個約束變量。Alldiff約束表示所有相關變量必須取不同的值。資源約束,atmost約束,檢測值域的最小值之和可以檢測相容性。
(2)CSP的回溯搜索的形式化
回溯搜索用于深度優先搜索中,它每次為一變量選擇一個賦值,當沒有合法的值可以賦給某變量時就回溯。
Initial state:the empty assignment, {}
Actions(s):中動作的數量等于未賦值的變量數
Transition model:為未分配的變量賦值,如果沒有合法的分配,則失敗
Goal test:當前任務已完成,滿足所有約束條件
Path Cost
(3)提高回溯搜索效率
變量的次序:優先選擇剩余值數量最少的變量,選擇剩余值數量多的變量容易使得剩余值數量少的變量的值域變為空值域。
如果剩余值數量相同:最大度變量優先,優先選擇對其他變量約束最多的變量,通過選擇與其它未賦值變量約束最多的變量來試圖降低未來的分支因子。
值的次序:最少約束值優先,選擇的取值應盡可能少地刪除鄰居變量的有效值。
前向檢驗:一個變量X賦值后,對每個相鄰變量Y根據弧相容推理從值域刪除與X不相容的值,如果某個變量值域變為空,就回溯。
更早地檢測失敗:維護弧相容,當變量X賦值后,INFERENCE調用AC-3,從與X相鄰的所有未賦值變量開始,進行約束傳播,一旦某個變量的值域變為空,則AC-3調用失敗并立即回溯。
(4)CSP的局部搜索 逃離高原
禁忌搜索:將最近訪問過的狀態記錄在表中,并禁止算法再回到那些狀態。
模擬退火也可以用于逃離高原。
約束加權:每個約束都有一個數字權重Wi,初始都為1。搜索的每一步,算法都選擇修改一個變量的值,使得違反的約束權重和最小化。接著增加當前賦值違反的約束的權重值。這給高原增加了地形,并且它隨著時間的進行不斷給難于解決的約束增加權重。
問題改變時局部搜索更容易。
獨立的子問題:獨立性可以簡單地通過在約束圖中尋找連通子圖來確定。每個連通子圖對應于一個子問題CSPi。如果Si是CSPi的一個解,那么∪iSi是∪iCSPi的一個解。假設變量共n個,每個子問題c個變量一共n/c個子問題,每個子問題的復雜性為O(dc),總工作量為O(dcn/c),不分解的情況下為O(dn)。
樹形結構:求解樹結構CSP時,首先任意選擇一個變量為樹的根,選擇變量順序,這樣每個變量在樹中出現在父結點之后。
基于刪除節點的方法:先對部分變量(環割集)賦值,使剩下的變量能形成一顆樹。
基于合并結點的方法:樹分解將約束圖分解為相關聯的子問題,每個子問題獨立求解,再把得到的結果合并起來。
樹分解必須滿足的條件:原問題中的每個變量至少在一個子問題中出現。 原問題中的兩個變量若有約束相連,它們至少同時出現在一個子問題中(連同 它們的約束)。如果一個變量出現在樹中的兩個子問題中,那么它必須出現在連接這兩個子問題的路徑上的所有子問題里。
樹分解CSP的求解:每個子問題被視為一個“巨型變量”,它的值域是這個子問題的所有解的集合。用前面給出的樹算法來求解連接這些子問題的約束,它們的共享變量要取相同的值。
總結
以上是生活随笔為你收集整理的【人工智能 一种现代方法】搜索-复习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux字符设备驱动详解
- 下一篇: 手眼标定算法