A*算法/博弈樹
前陣子考試學了A*算法、博弈樹和回溯,自己真是愚蠢至極,根本沒就搞明白這些,所以對於這些算法問道的話就不能說清楚,也記不住,所以才有了這篇筆記。在這里感謝面試我的那位工程師~~
A*算法
一些重要的概念
啟發式信息:用於幫助減少搜索量的與問題有關的信息或知識。
啟發式搜索:使用啟發信息指導的搜索過程叫做啟發式搜索。
估價函數:定義在狀態空間上的實值函數。
open表:未擴展的節點
close表:已擴展或正在擴展的節點
用f(n)表示節點n的估價函數:
1. f(n)表示從起點到目標,經由節點n最小費用路徑上費用的估計。(最短路徑 = 目前最短 + 剩下的估計最短路徑)
(在搜索圖中,接近解路徑的節點有較低的函數值)
2. 以估價函數f的遞增次序排列OPEN表中的節點:
估價函數低的排在前;具有相等函數值的節點以任意次序排序。
A算法與A*算法
g(n):對g*(n)的一個估計,是當前的搜索圖G中s到n的最優路徑費用 g(n)≥g*(n)
h(n):對h*(n)的估計,是從n到目標節點的估計代價,稱為啟發函數。
例如:當h(n) = 0, g(n) = d, 則f(n) = g(n)就變為了寬度優先搜索,也就是如果不需要啟發,那就是寬度優先搜索的算法了。
例子
八數碼問題:利用估價函數f(n)=d(n)+W(n)正向搜索八數碼難題,其中d(n)為深度,W(n)為目標的偏差數。
解題步驟不做介紹,很簡單,相信一會百度的。
感想
A*算法與以往的圖的搜索算法不同,是一種啟發式的算法,通過設計一種恰當的估計函數,越是接近真實值,就越會掉地搜索的成本,降低算法的開銷。這樣的話,估計的函數的設計就尤為重要了。
博弈樹
博弈樹是指由於動態博弈參與者的行動有先后次序,因此可以依次將參與者的行動展開成一個樹狀圖形。
博弈
對於任何一種博弈競賽,我們可以構成一個博弈樹。它類似於狀態圖和問題求解搜索中使用的搜索樹。博弈樹的結點對應於某一個棋局,其分支表示走一步棋;根部對應於開始位置,其葉表示對弈到此結束。在葉節點對應的棋局中,競賽的結果可以是贏、輸或者和局。
極大極小分析方法
在二人博弈問題中,為了從眾多可供選擇的行動方案中選出一個對自己最為有利的行動方案,就需要對當前的情況以及將要發生的情況進行分析,通過某搜索算法從中選出最優的走步。
基本思想或算法是:
(1) 設博弈的雙方中一方為MAX,另一方為MIN。然后為其中的一方尋找一個最優行動方案。
(2) 為了找到當前的最優行動方案,需要對各個可能的方案所產生的后果進行比較,具體地說,就是要考慮每一方案實施后對方可能采取的所有行動,並計算可能的得分。
(3) 為計算得分,需要根據問題的特性信息定義一個估價函數,用來估算當前博弈樹端節點的得分。此時估算出來的得分稱為靜態估值。
(4) 當端節點的估值計算出來后,再推算出父節點的得分,推算的方法是:對“或”節點,選其子節點中一個最大的得分作為父節點的得分,這是為了使自己在可供選擇的方案中選一個對自己最有利的方案;對“與”節點,選其子節點中一個最小的得分作為父節點的得分,這是為了立足於最壞的情況。這樣計算出的父節點的得分稱為倒推值。
(5) 如果一個行動方案能獲得較大的倒推值,則它就是當前最好的行動方案。
在博弈問題中,每一個格局可供選擇的行動方案都有很多,因此會生成十分龐大的博弈樹。試圖利用完整的博弈樹來進行極小極大分析是困難的。所以才有了α-β剪枝。
α-β剪枝
為了提高搜索的效率,引入了通過對評估值的上下限進行估計,從而減少需進行評估節點的范圍。
主要概念:
MAX節點的評估下限值α:
作為MAX節點,假定它的MIN節點有N個,那么當它的第一個MIN節點的評估值為α時,則對於其它節點,如果有高於α的節點,就取那最高的節點值作為MAX節點的值;否則,該點的評估值為α。
MIN節點的評估上限值β:
作為MIN節點,同樣假定它的MAX節點有N個,那么當它的第一個MAX節點的評估值為β時,則對於其他節點,如果有低於β的節點,就取最低的節點值作為MIN節點的值;否則,該店的評估值為β。
主要思想:
可以分為兩個步驟,分別為α剪枝和β剪枝。
如圖: