私は、alpha-betaプルーニングでミニマックスを使用してオセロエンジンを書いています。 それは大丈夫作業だが、私は次のような問題が見つかりました:アルゴリズムは、位置が失われたことを発見した場合Minimaxアルゴリズムが最良の移動を返さない
、予想通りそれは-INFINITYを返しますが、この場合 に私は「最良」の動きを追跡することができないんだけど...ポジションは既に失われていますが、有効な移動を返す必要があります(良いチェスエンジンがそうするように、より長く続く移動が望ましい)。
private float minimax(OthelloBoard board, OthelloMove best, float alpha, float beta, int depth)
{
OthelloMove garbage = new OthelloMove();
int currentPlayer = board.getCurrentPlayer();
if (board.checkEnd())
{
int bd = board.countDiscs(OthelloBoard.BLACK);
int wd = board.countDiscs(OthelloBoard.WHITE);
if ((bd > wd) && currentPlayer == OthelloBoard.BLACK)
return INFINITY;
else if ((bd < wd) && currentPlayer == OthelloBoard.BLACK)
return -INFINITY;
else if ((bd > wd) && currentPlayer == OthelloBoard.WHITE)
return -INFINITY;
else if ((bd < wd) && currentPlayer == OthelloBoard.WHITE)
return INFINITY;
else
return 0.0f;
}
//search until the end? (true during end game phase)
if (!solveTillEnd)
{
if (depth == maxDepth)
return OthelloHeuristics.eval(currentPlayer, board);
}
ArrayList<OthelloMove> moves = board.getAllMoves(currentPlayer);
for (OthelloMove mv : moves)
{
board.makeMove(mv);
float score = - minimax(board, garbage, -beta, -alpha, depth + 1);
board.undoMove(mv);
if(score > alpha)
{
//Set Best move here
alpha = score;
best.setFlipSquares(mv.getFlipSquares());
best.setIdx(mv.getIdx());
best.setPlayer(mv.getPlayer());
}
if (alpha >= beta)
break;
}
return alpha;
}
私が使用してそれを呼び出す:失われた位置は(それが例えば10の移動後失った想像する)場合
AI ai = new AI(board, maxDepth, solveTillEnd);
//create empty (invalid) move to hold best move
OthelloMove bestMove = new OthelloMove();
ai.bestFound = bestMove;
ai.minimax(board, bestMove, -INFINITY, INFINITY, 0);
//dipatch a Thread
new Thread(ai).start();
//wait for thread to finish
OthelloMove best = ai.bestFound();
を検索し、上記最良の変数が等しく、ここ
は、コードがあります引数として渡された空の無効な移動に...なぜ?
ありがとうございました!
[faq]と[ask]を読んで、さらに具体的な質問をしてください。さらに、あなたの質問は不完全です。あなたは問題のかなり重要なクラス 'AI'の定義を示していません –
問題は概念的であり、コードの問題ではありません。私が提供するコードは、私が考える問題を解くのに十分です。しかし、とにかくありがとう、私はもっと知るためにこれを読むでしょう。 – Fernando