五子棋智能算法-博弈樹算法思想詳解(一)

學習這個算法之前必會鏈表 關於鏈表看這兩篇博文

https://blog.csdn.net/viafcccy/article/details/84502334

https://blog.csdn.net/viafcccy/article/details/85041942

 

在五子棋下棋中 我們最容易想到的算法就是對於棋局的推演 從而找到一種最佳的情況去使棋局向這個方向發展

爲了簡單思考我們首先想一個五子棋的開局

 

這種情況下黑棋有兩種選擇就是下方這兩種棋型由於考慮到建模的複雜程度 和 計算機下棋的考慮時間 我們只考慮所有的直線型的棋型 將所有的直線型棋局窮舉出來是可能的(我這裏相當於將直線作爲下棋的單位 所有的推演都是去尋找直線的棋局)

這裏我列舉出來

/***************一子/二子******************/
x0
0                  
00
0_0 
0_ _0
0_ _ _0
x00
x0_0
x0_ _0    
x0_ _ _0

/*****************三子**********************/ 
000 
0_00                            
00_ _0   
0_0_0
x000 
x0_00
x00_0
X0_ _00
X0_0_0
X00_ _0

/*****************四子**********************/
0000
0_000
00_00
x0000
x000_0
x0_000
x00_00

/*****************五子**********************/
00000

於是 此時 我們需要的是電腦去搜索所有的棋型 並把所有的情況列舉出來構成一棵樹 去推演最後選擇最有利的一種棋型

下面我們需要的是爲各個棋型打出分值 顯然 例如 連成五子的棋型 對於我方來說是正無窮分 但是如果對方構成就需要打分負無窮分... 但是剩下的棋型打分需要自己去權衡和思考 可以是從你下棋的角度 認爲某種棋型有利就是高分(對方就是相反數 會更小)

現在我要記住這棵樹是從電腦出發去思考(所有的打分都是根據電腦去打分) 也就是 在電腦下棋的時候選擇分數最高的一種局勢 在對手下棋的時候肯定是去思考對對手最有利的情況(也就是分數最小的情況) 【這裏爲啥是最小很好想 對手四個連成一排 勢必要去先處理這個位置的四個棋子 事情肯定是最緊急的優先去處理】 於是構成了下面的這棵博弈樹

構建好這樣一棵博弈樹之後  就要去從最底層去逐層選擇最小值和最大值去逐層推演 直到選擇一種最佳的棋型 其實在編程時 我們要

1.搜索下一步所有的棋型

2.爲每一種棋型建立一顆博弈樹 最後選出分數最高的下一步

alpha-beta剪枝搜索 

 但是這裏存在一個問題隨着樹的深度、廣度的不斷擴張 運算的數量是成指數級上漲的 也就是說電腦的運算次數有限 也就是整棵樹的深度、廣度是有限的 我們想要去在一定的時間裏推演出更多的步驟 就需要去剔除一些顯然不可能向上傳遞的分支 這裏這個過程就叫做alpha-beta剪枝搜索 

重新回到開始的模型

也就是說不需要遍歷完每一個節點 在遍歷中遇到不可能的值時就直接剔除(圖樹的遍歷是有深度和廣度遍歷的不要忘記) 

同理在上一層是選擇最小值的時候 也是同一個道理

最後總結一下最基本的博弈樹 和 alpha-beta剪枝算法步驟

1.搜索周邊所有的棋型

2.選擇每一種可能的走法 不斷的搜索棋型 建立一棵博弈樹 遍歷 剪枝 推導出初始節點分值

3.最終選擇一棵分值最高的博弈樹的初始節點 按照這種棋型

4.等待人落子

5.重複1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章