0

コードのスニペットは、tictactoe ゲームでの位置の bestMove を計算するために作成されます。minRating != LOSING_POSITION という for ループの条件を除いて、コードのほぼすべての部分を取得しました。このコードは、指定された疑似コードの実装に由来します。

moveT FindBestMove(stateT state, int depth, int & rating) {
for (*each possible move or until you find a forced win*) {
 *Make the move.
 Evaluate the resulting position, adding one to the depth indicator.
 Keep track of the minimum rating so far, along with the corresponding move.
 Retract the move to restore the original state.*
 }
*Store the move rating into the reference parameter.
Return the best move.*
}

for ループの 2 番目の条件を、forced win が見つかるまで指定されたコードと一致させることができませんでした。この事実とその minRating != LOSING_POSITION との類似点を見つけることができませんでした

moveT FindBestMove(stateT state, int depth, int & rating) {
Vector<moveT> moveList;
GenerateMoveList(state, moveList);
int nMoves = moveList.size();
if (nMoves == 0) Error("No moves available");
moveT bestMove;

int minRating = WINNING_POSITION + 1;

for (int i = 0; i < nMoves && minRating != LOSING_POSITION; i++) {

 moveT move = moveList[i];
 MakeMove(state, move);
 int curRating = EvaluatePosition(state, depth + 1);

 if (curRating < minRating) {
  bestMove = move;
  minRating = curRating;
  }

 RetractMove(state, move);
 }
rating = -minRating;
return bestMove;

}


int EvaluatePosition(stateT state, int depth) {
int rating;

if (GameIsOver(state) || depth >= MAX_DEPTH) {
 return EvaluateStaticPosition(state);
}

FindBestMove(state, depth, rating);
return rating;
}
4

1 に答える 1

1

あなたのプログラムは、割り当てWINNING_POSITION(対戦相手の勝利だと思います)から始まりminRating、動きをループして、最大のダメージで動きを見つけようとし、最小化しminRatingます。

EvaluatePosition戻ってきたLOSING_POSITION場合、この手はあらゆる場合に対戦相手の負けにつながることを意味するため、検索を終了することができ、この手は最良の手と見なされます。

明らかな がない場合LOSING_POSITIONS、アルゴリズムは静的評価に従って「最良の」動きを選択します。

于 2012-11-26T06:44:24.853 に答える