博弈, 即對抗搜尋問題, 指在競爭環境中, 每個agent的目標間是衝突的.
零和遊戲, 遊戲結束時效用值總是相等且符號相反.
剪枝: 在搜尋樹中忽略不影響最後決定的部分.
啟發式的評估函式: 在不進行搜尋的情況下估計某狀態的效用值.
s0: 初始狀態
player(s): 定義此時誰行動
actions(s): 返回此狀態下的合法行動集合
result(s, a): 轉移模型, 定義行動的結果
terminal-test(s): 終止測試
utility(s, p): 效用函式, 定義p在終止狀態s下的數值
類似於and-or演算法, max需要制定應急策略, 需要考慮min的每種可能行動.
假設每個玩家都按最優策略行棋, 那麼結點的極小極大值就是對應狀態的效用值. max偏向於移動到有極大值的狀態, min偏向於移動到有極小值的狀態.
對應的博弈樹:
公式:
遞迴到葉結點, 然後將值回傳.
相當於max決定走哪一步之前, 需要不停想下一步min怎麼走, 下下步我怎麼走…直到走到最終狀態, 然後再決定我這一步究竟該怎麼走.
採用向量表示狀態效用值.
當前結點值未知, 範圍為[-∞, +∞], 遞迴地去探索子結點, 直到遇到終止狀態, 然後開始回寫(遞迴地縮小父結點的範圍), 並判斷是否需要繼續探索其它子結點.
另一種表述: 選手移動到結點n, 但如果n的父結點或祖先結點上有更好的選擇m, 選手就永遠不會到達n, 所以一旦發現n的足夠資訊(通過檢查它的後代), 就可以剪裁它.
名稱含義
α = 目前為止路徑上發現的max的最佳選擇
β = 目前為止路徑上發現的min的最佳選擇
搜尋中不斷更新α和β, 一旦發現某個結點的α或β比現在的值更差時, 就剪裁這個結點剩下的分支.
若能檢查結點能夠採取最佳優先的順序(即盡量多地裁剪), 效率為o(bm/2)而非o(bm), 相當於有效分支因子變為b1/2.
理解:n(結點數) = 2 * (b0 + b1 + … + bm/2) = o(bm/2)
若檢查後繼狀態為隨機順序, 那麼要檢查的結點數為o(b3m/4).
提高效率的一些方法: 增加行棋排序方案(比如優先執行哪些步), 維護換位表(記錄以前出現過的棋局)
對比極小極大演算法和α-β演算法: 前者需要生成整個博弈的搜尋空間, 後者可以剪裁掉一大部分.
用估計棋局效用值的啟發式評估函式eval取代效用函式, eval的截斷測試取代終止測試.
啟發式極小極大值:
對於終止狀態, 排序結果不變; 對於非終止狀態, 返回乙個根據取勝機率的期望值(可以根據當前棋局的特徵評估).
最直接的方式是設定固定的深度限制, 當達到該限制或者到了終止結點時cutoff-test(state, depth)返回true. 更好的方法是採用迭代深入.
地平線效應: 一些實際上無法避免的事情, 通過將它推出當前的搜尋深度之外, 來認為自己避免了那件事情.
單步延伸: 在給定棋局中發現一種較好的棋招, 就記住它, 當搜尋深度達到限制時, 若此單步延伸合法, 則考慮此棋招.(這樣做可能會超過深度限制, 但由於單步延伸很少, 不會增加太多開銷)
在某個結點上無需進一步考慮而直接剪裁一些子結點.
概率截斷演算法: 根據以前的經驗估計深度d上的值v是否可能在(α, β)範圍外.
開局前幾步的棋局狀態大都常見, 因此可以通過查表; 之後的行棋就通過搜尋; 博弈接近尾聲時的棋局可能性有限, 因此又恢復到查表.
加入機會結點, 值為所有子結點的期望:
蒙特卡洛近似:
python第五章 Python學習(第五章)
記錄所有的名片字典 card list defshow menu 顯示資訊 print 50 print 歡迎使用 名片管理系統 v1.0 print print 1.新增名片 print 2.顯示全部 print 3.搜尋名片 print print 0.退出系統 print 50 defnew ...
第五章 雜湊
雜湊表adt,只支援二叉樹查詢所允許的一部分操作。比如插入,刪除,查詢等。那些需要元素間排序資訊的操作將不會得到支援。比如findmin,findmax和線性時間按排序順序列印整個表的操作時不支援的。雜湊函式在理想狀態是能將任何兩個不同的關鍵字對映到不同的單元,但是這是不可能,因為關鍵字是無窮的,但...
第五章 函式
第五章 函式 1 函式的定義 shell函式定義可以放在 bash profile 檔案中,也可以在使用該函式的指令碼中,還可以在命令列中 通過 source 或 執行bash profile檔案,使修改能夠立即生效 function 函式名 declare f 顯示定義的函式清單 export f...