転置表をアルファベータスカウトに配置しようとしています。ゲームの途中または後半に向けて、速度が徐々に向上するのはわかりますが、テーブルサイズが1〜2 GBの場合でも、トランスポーズテーブルからまったく読み取らないよりも遅くなる場合と遅くならない場合があります。また、テーブルなしでまったく同じゲームをプレイする場合、効率的な移動よりも少ないことに気づきます。
私はZobristのキーハッシュをテストしましたが、移動を行って元に戻した後でも正しくハッシュされます。私はそれらが問題であるとは思わない。これらの記事のアドバイスに従って、アルファ/ベータ剪定を設計しようとしました。 http://web.archive.org/web/20070809015843/http://www.seanet.com/~brucemo/topics/hashing.htm http://mediocrechess.blogspot.com/2007/01/guide-transposition- tables.html
誰かが間違いを特定するのを手伝ってくれる?多分私はハッシュからアルファ対ベータをチェックする評価を理解していません。または、1〜2 GBは小さすぎて違いがありませんか。必要に応じて、転置表のコードをさらに投稿できます。
public int alphaBetaScout(Board board, int depth, int alpha, int beta, bool color, bool
quiscence)
{
// !!!! With or without this specific section, and any other Transpose.Insert, doesn't make the game play or evaluate any faster.
HashType type = HashType.AlphaPrune;
HashEntry h = Transpose.GetInstance().Get(board.zobristKey);
if (h != null)
{
if (h.depth >= depth)
{
if (h.flag == HashType.ExactPrune)
{
return h.scored;
}
if (h.flag == HashType.AlphaPrune)
{
if(h.scoredState > alpha)
{
alpha = h.scored;
}
}
if (h.flag == HashType.BetaPrune)
{
if(h.scoredState < beta)
{
beta = h.scored;
}
}
if (alpha >= beta)
{
return alpha;
}
}
}
if (board.terminal)
{
int scoredState = board.Evaluate(color);
Table.GetInstance().Add(board.zobristKey, depth, Entry.EXACT, scoredState);
return scoredState;
}
//May do Quescience search here if necessary && depth = 0
Stack movesGenerated = GeneratePossibleMoves();
while(!movesGenerated.isEmpty())
{
int scoredState = MAXNEGASCOUT;
board.MakeMove(movesGenerated.pop());
int newAlpha = -(alpha +1)
scoredState = -alphaBetaScout(board, depth - 1, newAlpha, -alpha, !color, quiscence);
if (scoredState < beta && alpha < scoredState)
{
scoredState = -alphaBetaScout(board, depth - 1, -beta, -scoredState, !color, quiscence);
}
board.UndoMove();
if (scoredState >= beta)
{
Table.GetInstance().Add(key, depth, Entry.BETA, beta);
return scoredState;
}
if (scoredState > alpha)
{
type = HashType.ExactPrune;
alpha = scoredState;
}
}
Table.GetInstance().Add(key, depth, type, alpha);
return alpha;
}