-
global variables
INF
:隨便定的 infinity,目前設 1e10CORNER, EMPTY, BLACK, WHITE
:隨便給數字,增加 code readability 而已WIDTH, HEIGHT
:盤面大小,8x8NORTH, NORTHEAST, ..., DIRECTIONS
:各種移動方向,第一個與第二個值分別為 row 與 col 的移動方向
-
SearchAgent()
- attribute
PLAYER
:agent 的身分(黑棋 or 白棋)MAX_DEPTH
:最大搜尋深度DURATION
:最大思考時間WEIGHT_PIECE
:權重WEIGHT_EDGE
:權重WEIGHT_MOVE
:權重LIFETIME
:now +DURATION
- method
OutOfBoard(pos, direction)
- 檢查
pos
沿direction
方向移動一步後是否超出棋盤
- 檢查
IsValidMove(board, pos, direction, is_black)
- 如果把棋子下在
pos
,並檢查沿direction
方向是否能把敵方的棋子 flip
- 如果把棋子下在
GetValidMoves(board, is_black)
- central 6x6 的位置只要是
EMPTY
就是 valid move - 檢查四條邊有沒有 valid move,原本可以用 for-loop 就好,但為了減少搜尋時間所以把所有情況展開個別處理
- central 6x6 的位置只要是
CheckFlip(board, pos, direction, is_black)
- 檢查目前的
board
以pos
為出發點,沿direction
方向前進,是否有 opponent 的 piece 可以 flip - return 是否有東西可 flip, 所有可 flip 的座標
- 檢查目前的
PlaceAndFlip(board, pos, is_black)
- place a piece at
pos
, then callCheckFlip
- place a piece at
Evaluate(board, is_black)
- calculate the score of current board
- things being taken into account
- number of pieces on the edge
- number of available moves
- number of total pieces
- 權重比較請見 Note
PVS(board, is_black, depth, alpha, beta)
- attribute
- 詳細 code 請參考 reinforcement 與 td_agent_dev 兩個 branch
- 將訓練好的 weights 用於對局
- 利用 reinforcement learning - TD learning 學習出來的 weights
- 有四個本版:訓練 10 萬、15 萬、20 萬、25 萬場的 weights
.p
檔名開頭的all_{數字}
all_2
:使用 2-tuple 訓練all_3
:使用 3-tuple 訓練
.p
檔名中間的ref
、custom
ref
:參考 paper 所實作的 networkscustom
:基於ref
上另外添加一些資訊的 networks
.p
檔名末端的black
、white
black
:針對先手的 weights(黑棋先下)white
:針對後手的 weights
SA.py 跟助教提供的 AI 對局的結果
對局 100 場
對於相同 score 的 move -> 選擇第一個走訪的
參數 | 結果 |
---|---|
DURATION = 4.98 WEIGHT_PIECE = 1.0 WEIGHT_EDGE = 100.0 WEIGHT_MOVE = 10.0 |
我方勝場:61 平手:6 我方勝率:61.0% 對方勝率:33.0% |
DURATION = 4.98 WEIGHT_PIECE = 0.1 WEIGHT_EDGE = 100.0 WEIGHT_MOVE = 10.0 |
我方勝場:74 平手:6 我方勝率:74.0% 對方勝率:20.0% |
DURATION = 4.98 WEIGHT_PIECE = 10.0 WEIGHT_EDGE = 100.0 WEIGHT_MOVE = 50.0 |
我方勝場:69 平手:4 我方勝率:69.0% 對方勝率:27.0% |
DURATION = 4.98 WEIGHT_PIECE = 100.0 WEIGHT_EDGE = 50.0 WEIGHT_MOVE = 1.0 |
我方勝場:54 平手:11 我方勝率:54.0% 對方勝率:35.0% |
DURATION = 4.98 WEIGHT_PIECE = 100.0 WEIGHT_EDGE = 1.0 WEIGHT_MOVE = 50.0 |
我方勝場:58 平手:8 我方勝率:58.0% 對方勝率:34.0% |
DURATION = 4.98 WEIGHT_PIECE = 100.0 WEIGHT_EDGE = 1.0 WEIGHT_MOVE = 10.0 |
我方勝場:49 平手:5 我方勝率:49.0% 對方勝率:46.0% |
DURATION = 4.98 WEIGHT_PIECE = 100.0 WEIGHT_EDGE = 10.0 WEIGHT_MOVE = 1.0 |
我方勝場:60 平手:3 我方勝率:60.0% 對方勝率:37.0% |
SA.py 跟助教提供的 AI 對局的結果
對局 100 場
對於相同 score 的 move -> 隨機挑一個
看起來沒有比較好
參數 | 結果 |
---|---|
DURATION = 4.98 WEIGHT_PIECE = 0.1 WEIGHT_EDGE = 100.0 WEIGHT_MOVE = 10.0 |
我方勝場:57 平手:3 我方勝率:57.0% 對方勝率:40.0% |
DURATION = 4.98 WEIGHT_PIECE = 100.0 WEIGHT_EDGE = 50.0 WEIGHT_MOVE = 1.0 |
我方勝場:46 平手:8 我方勝率:46.0% 對方勝率:46.0% |
DURATION = 4.98 WEIGHT_PIECE = 100.0 WEIGHT_EDGE = 1.0 WEIGHT_MOVE = 50.0 |
我方勝場:51 平手:6 我方勝率:51.0% 對方勝率:43.0% |
DURATION = 4.98 WEIGHT_PIECE = 100.0 WEIGHT_EDGE = 1.0 WEIGHT_MOVE = 10.0 |
我方勝場:55 平手:7 我方勝率:55.0% 對方勝率:38.0% |
DURATION = 4.98 WEIGHT_PIECE = 100.0 WEIGHT_EDGE = 10.0 WEIGHT_MOVE = 1.0 |
我方勝場:47 平手:6 我方勝率:47.0% 對方勝率:47.0% |
DURATION = 4.98 WEIGHT_PIECE = 1.0 WEIGHT_EDGE = 100.0 WEIGHT_MOVE = 10.0 |
我方勝場:49 平手:7 我方勝率:49.0% 對方勝率:44.0% |
DURATION = 4.98 WEIGHT_PIECE = 10.0 WEIGHT_EDGE = 100.0 WEIGHT_MOVE = 50.0 |
我方勝場:54 平手:4 我方勝率:54.0% 對方勝率:42.0% |