0

我已經實施了跳棋alpha-beta修剪,並認爲我有它的工作,但發現計算機不需要連續多次跳轉(當它必須)。例如:Alpha-beta修剪連續移動爲同一個球員

AI做:

O _ _ _ _  _ _ _ _ _ 

_ X _ X _ -> _ _ _ X _ (misses a jump because it only does a single move) 

_ _ _ _ _  _ _ O _ _ 

AI 應該做:

O _ _ _ _  _ _ _ _ O 
_ X _ X _ -> _ _ _ _ _ (sees that it's current turn is not finished, continues) 
_ _ _ _ _  _ _ _ _ _ 

我試圖通過檢查MovePiece的返回值,返回播放器是否要修復它已經完成了他的轉身,取決於是否跳投以及是否還有進一步的跳投。根據返回值,它將再次運行MaxValue/MinValue(取決於它在第一次看到還有哪些進一步移動時所處的位置),或者繼續在樹中並切換播放器。

相關代碼(C#)如下(retVal的是一個包含價值,深度的類型,和動做):

foreach(var m in moves) 
{ 
    var resultingBoard = board.Clone(); 

    var moveResult = resultingBoard.MovePiece(m.TypeOfMove, 
           resultingBoard.GetPieceAtPosition(m.OriginalPieceLocation.X, 
                    m.OriginalPieceLocation.Y), 
           m.FinalPieceLocation.X, m.FinalPieceLocation.Y); 

    var newDepth = currentDepth; 

    if(moveResult == TurnResult.NotDone) 
    { 
     retVal = MaxValue(resultingBoard, ref alphaValue, ref betaValue, color, ref newDepth, ref maxDepth); 
    } 
    else if(moveResult == TurnResult.Finished) 
    { 
     newDepth++; 
     retVal = MinValue(resultingBoard, ref alphaValue, ref betaValue, color == PieceColor.Black ? PieceColor.Red : PieceColor.Black, ref newDepth, ref maxDepth); 
    } 
} 

...

然而,這個結果在一些...有趣的結果(第一步除了最小的修剪之外什麼也不做),儘管我認爲這將是正確的改變。

正在讓MaxValue/MinValue再次調用自己的新舉措做正確的事情嗎?

回答

2

事實上,你的極大極小算法需要「產生」新的移動smells(當你需要吃第二塊)。

我會嘗試重新設計它 - 你可以做到這一點延長move(在迭代moves的元素),使它包含的移動元組(或列表),並避免TurnResule.NotDone在minimax算法階段。

使用這種方法 - 列表moves將被預先擴展爲除了單個移動之外還包含移動(eat piece,eat piece)


該解決方案將使算法更穩健,並且可以讓您輕鬆進行未來修改。