2010-11-05 108 views
2

我希望看到沒有遞歸的alpha-beta搜索(更確切地說,negamax)的實現。我知道基本的想法 - 使用一個或多個堆棧來跟蹤關卡的水平,但是有一個真實的代碼會讓我省下很多時間。使用Java,C#或Javascript是完美的,但C/C++沒有問題。沒有遞歸的α-β樹搜索

這裏的(簡化的)遞歸代碼:

function search(crtDepth, alpha, beta) 
{ 
    if (crtDepth == 0) 
    return eval(board); 

    var moves = generateMoves(board); 
    var crtMove; 
    var score = 200000; 

    var i; 
    while (i<moves.length) 
    { 
    crtMove = moves.moveList[i++]; 

    doMove(board, crtMove);  
    score = -search(crtDepth-1, -beta, -alpha); 
    undoMove(board, crtMove); 

    if (score > alpha) 
    { 
     if (score >= beta) 
     return beta; 

     alpha = score; 
    } 
    } 
    return alpha; 
} 

搜索(4,-200000,200000);

+0

發佈你的結構和一些代碼與遞歸將有助於誰會爲你遞減。至少你會更精確地得到你想要的東西。 – 2010-11-05 08:35:06

+1

Google:java alpha-beta搜索negamax – 2010-11-05 08:39:00

+0

@battal,我有正常的遞歸代碼。我無法找到一個非遞歸的。 – Gaspy 2010-11-05 15:24:03

回答

1

Knuth和Moore於1975年發表了一個迭代的α-β程序,使用特殊的Algol語言。

An Analysis of Alpha Beta Pruning(頁301)

另外在「關於算法分析論文選集」第9章

它看起來並不很容易變相爲C#,但它可能會幫助別人誰願意做它爲優化的純粹樂趣。

我很新來國際象棋編程,所以它超出了我的能力。另外,當我從「Copy-Make」切換到「Make-Unmake」時,我的最大性能提升。我使用的是XNA,因此將GC延遲降至幾乎0可以解決我所有的性能問題,現在我的360上的運行速度比我的電腦上運行速度快,所以這種優化似乎太難以滿足我的需求。

另見Recursion to Iteration

1

對於代碼更近一點,我寫了一個非遞歸Negamax程序作爲EasyAI Python庫的選項。特定源代碼是在:

https://github.com/Zulko/easyAI/blob/master/easyAI/AI/NonRecursiveNegamax.py

它使用與對象的固定陣列(由目標深度來確定大小)一個簡單的循環,以向上和向下移動該樹以有序的方式。對於我使用它的特定項目,它比遞歸版本快六倍。但我相信每場比賽都會有不同的迴應。

沒有辦法否認這是一些密集而複雜的代碼,並且轉換爲C/Java/C#將會......具有挑戰性。這幾乎只是邊界情況。 :)

如果您將其轉換爲C/Java/C#,我很樂意看到結果。在評論中放置一個鏈接?