人工智能 一种现代方法 第3章 用搜索树对问题求解
人工智能 一種現代方法 第3章 用搜索樹對問題求解
2018.3.20
有一些問題無法通過單獨的行動得出解,需要行動序列達到目標,則需要使用搜索法。
3.1問題求解智能體
目標形式化:基于當前的情形和智能體的性能度量進行目標形式化
FORMULATE-GOAL(state)
問題形式化:在給定目標下確定需要考慮哪些行動和狀態。
FORMULATE-PROBLEM(state, goal)
搜索:尋找能夠達到目標的行動序列
SEARCH(problem)
3.1.1良定義的問題及解
初始狀態、行動、轉移模型、目標狀態、路徑耗散
3.1.2問題的形式化
抽象:在問題表示中去除不相關的細節的過程
3.2問題實例
從玩具問題過渡到現實世界問題
3.2.1玩具問題
玩具問題可以用來檢驗新的搜索算法的能力
形式化:狀態、初始狀態、行動、轉移模型、目標測試、路徑耗散、后繼函數
八數碼問題:3*3的格子中有一個空位置,通過移動將其按順序排好
八皇后問題:8*8的棋盤上擺放8個棋子,使其橫豎斜三方向均沒有其他棋子
3.2.2現實世界問題
履行問題、 旅行商問題(TSP)、 VLSI布線問題、 機器人導航問題、自動裝配序列問題
3.3通過搜索求解
初始狀態:搜索樹的根節點
行動:搜索樹的每條連線
結點 :問題狀態空間中的狀態
擴展:在當前狀態上選擇行動
邊緣:所有待擴展的葉子節點的集合
搜索策略:如何選擇要擴展的狀態
探索集:記錄每一個已擴展的節點,新生成的節點如果與探索集中重合,則不考慮該結點,用于避免回路。
3.3.1搜索算法基礎
定義樹中每個結點的數據結構
- n.STATE:狀態
- n.PARENT:父節點
- n.ACTION:父節點到該結點的行動
- n.PATH-COST:根節點到該結點的路徑消耗
隊列
- FIFO隊列:先進先出
- LIFO隊列:棧,后進先出
- 優先級隊列:根據函數計算最高優先級先出
3.3.2問題求解算法的性能
評價性能的標準
- 完備性:是否保證找到解
- 最優性:找到的解是否最優
- 時間復雜度:找到解需要多少時間
- 空間復雜度:在執行搜索過程中需要多少內存
復雜度的表達
- b:分支引子 任何節點的最多后繼數
- d:深度 目標節點的最淺深度 根節點到目標節點的步數
- m:狀態空間中任何路徑的最大長度
評價搜索有效性—搜索代價,通常由時間復雜度和空間復雜度決定
3.4無信息搜索策略
生成后繼、區分目標狀態與非目標狀態
3.4.1寬度優先搜索(廣度優先搜索)
- 定義:先擴展根節點,在擴展根節點的所有后繼,在擴展他們的后繼。也可以理解為一層一層的擴展。
- 解決辦法:FIFO(First In First Out) 先進先出的隊列
- 性能:
- 完備性:寬度優先搜索是完備的,一定能找出目標節點
- 最優性:對于路徑代價基于節點深度非遞減,則是最優的,但實際上路徑代價不一定基于節點深度非遞減。
- 時間復雜度和空間復雜度:O(b^d)指數級增長,時空復雜度很差
3.4.2一致代價搜索
考慮了每一步的代價不同的搜索。
若訪問到已經探索過的節點,則會比較現在的代價和以前的代價大小,若當前訪問路徑的代價小,則會替換掉原先的訪問路徑。同時在訪問邊緣節點時,也會先選擇代價最小的節點。
- 性能:
- 完備性 最優性:一定能找到最優節點(因為每當選擇一個節點去擴展時,必然已找到到達該節點的最優路徑)
- 復雜度:可能比廣度優先搜索大得多,因為每當探索一個代價大的行動之前,就必然會探索很多代價小的行動。
3.4.3深度優先搜索
- 定義:總是擴展搜索樹當前邊緣結點集中最深的結點,直到擴展完后,將其從邊緣節點中去掉,回溯到下一個未擴展的深度稍淺的結點。
- 解決辦法:LIFO(Last In First Out) 棧
- 性能:
- 完備性:在避免榮譽路徑和重復狀態的圖搜索中是完備的,但樹搜索則有可能陷入死循環中。在無限狀態空間中,則均可能陷入死循環中。
- 最優性:不一定是最優的
- 時間復雜度:可能是無限的
- 空間復雜度:很小,O(bm),b為分支引子,m為某節點最大深度。只需要記錄某節點到根節點的所有節點和他們的相鄰后繼即可。
回溯搜索:與深度優先搜索類似,空間復雜度只需要O(m),即不擴展每一個行動,而是一個一個擴展
3.4.4深度受限搜索
- 定義:對深度優先搜索設置深度界限l,深度超過l的節點被當作沒有后繼來對待。
- 性能:
- 完備性:如果l
3.4.5迭代加深的深度優先搜索
- 定義:不斷地增大深度限制,不斷執行深度受限搜索,直到找到目標
- 性能:
- 完備性:分支引子有限時完備
- 最優性:路徑代價是節點深度的非遞減函數時最優
3.4.6雙向搜索
- 定義:同時運行兩個搜索,一個從初始狀態向前搜索,另一個從目標狀態向后搜索,直到相遇。
- 性能:
- 完備性:分支引子有限時完備
- 最優性:不一定是最優的
- 時空復雜度:O(b^(d/2))
- 難點:如何向后搜索,部分問題可以向后搜索,但有些問題向后搜索會使得分子引子很大。
3.5有信息(啟發式)的搜索策略
3.5.1貪婪最佳優先搜索
- 定義:在每一步擴展時,都試圖擴展離目標最近的結點。(直線距離啟發式,記hSLD)
- 性能
- 完備性:不一定能找到解,容易鉆進離目標節點近的死胡同。
- 最優性:不一定是最優的,因為其貪婪地每次都尋找離目標結點最近的結點
- 時空復雜度:hSLD均很小, O(h),只搜索一條路徑;但最壞情況下,O(b^m)
3.5.2A*搜索:縮小總評估代價
- 定義:f(n) = g(n) + h(n),每次都選擇擴展f(n)最小的結點,在擴展時檢測是否到達目標。
- f(n):經過結點n的最小代價解的估計代價(有可能略小于真實代價)
- g(n):到達此結點已經花費的真實代價
- h(n):從該結點到目標結點所花代價
- 保證最優的條件:
- 可采納性:h(n)是一個可采納啟發式,從不會高估到達目標的代價。例如直線距離啟發式。
- 一致性(單調性):h(n) <= c(n, a, n1) + h(n1),即滿足三角不等式
3.5.3存儲受限的啟發式搜索
將迭代加深的思想用在啟發式算法中。迭代加深A*算法,IDA*算法。
原來的迭代加深算法截斷值是搜索深度,現在改為f代價。
遞歸最佳優先搜索(RBFS)
- 定義:f_limit記錄次優路徑的f值,如果當前后繼節點的f值均大于f_limit就暫緩探索該節點,將其后繼節點f的最小值代替該節點的f,轉而探索次優節點,并重復以上步驟。
- 優點:僅用線性內存
- 缺點:內存使用過少,導致有很多節點被重復擴展,冗余路徑也會帶來復雜度的指數級增長
內存受限A*(MA*) 簡化內存受限A*(SMA*)
- 定義:探索最佳葉子節點直到內存耗盡,丟棄當前f最大節點,并添加新節點。
- 權衡時空復雜度成為算法探索的最終目的
3.6啟發式函數
對于八數碼問題的啟發式函數有兩個常用的,兩個啟發式函數都沒有超過實際的解代價
- h1=不在位置上的棋子數,最大為8
- h2=所有棋子到其目標位置的距離合(水平距離+垂直距離),最大值在20左右
3.6.1啟發式的精確度對性能的影響
啟發式的設計對有效分支因子的值有影響。
一般來說啟發式使用值更大的函數是更好的。
3.6.2從松弛問題出發設計可采納的啟發式
松弛問題:減少了行動限制的問題,狀態空間是原有狀態空間的超圖,多了很多邊。
意義:一個松弛問題最優解的代價,是原問題的可采納啟發式。
生成:通過去掉經過形式化的原問題的一個或幾個條件可以形成松弛問題。
最優松弛問題:可以比較生成的松弛問題的最優解的代價,選擇最大的最優解代價的松弛問題。
除此之外還可以通過從子問題除法設計可采納的啟發式和從經驗中得到啟發式等。
總結
以上是生活随笔為你收集整理的人工智能 一种现代方法 第3章 用搜索树对问题求解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第三十四期:游戏开发中常见的10种编程语
- 下一篇: 适用于游戏开发领域的语言