알파 베타 제거 및 퀴즈 검색을 사용하여 negamax를 구현했는데 작동하는 것처럼 보입니다 ... 때때로 컴퓨터는 1, 심지어는 비록 그것을 막기 위해 할 수있는 움직임이 있었지만 (이것은 깊이있는 4에서 일어 났고, 그것은 분명히 발견되어 져야만했습니다).체스 C : Negamax 구현은 작동하지만 때로는 1을 찾지 못합니다.
static double alphaBetaMax(double alpha, double beta, int depthleft, game_t game, bool player)
{
move_t *cur;
move_t *tmp;
double score = 0;
bool did_move = false;
cur = getAllMoves(game, player); //getAllMoves initilizes a global list of moves, firstMove
if(cur == NULL) /* check mate*/
return -9999999*(player*2-1);
tmp = firstMove;
firstMove = 0;
while (cur != NULL)
{
game_t copy;
if(depthleft<=0 && !isCapture(game, cur)) { /* Quiescence search */
cur = cur->next;
continue;
}
did_move = true;
copyGame(game, ©);
makeMove(©, *cur);
firstMove = NULL;
score = -alphaBetaMax(-beta, -alpha, depthleft - 1, copy, !player);
if(board_count > MAX_BOARDS)
break;
freeGame(copy);
if(score > alpha)
alpha = score;
if (beta <= alpha)
break;
cur = cur->next;
}
firstMove=tmp;
freeMoves();
if(!did_move)
alpha = evaluate(game)*(player*2-1);
return alpha;
}
move_t* getBestMove(game_t game, int player, unsigned int depth) // initial call
{
move_t *cur = NULL, *best = NULL;
move_t *tmp;
double alpha = -DBL_MAX, score = 0;
freeMoves();
firstMove = NULL;
cur = getAllMoves(game, player);
tmp = firstMove;
firstMove = 0;
while (cur != NULL)
{
game_t copy;
copyGame(game, ©);
makeMove(©, *cur);
firstMove = NULL;
score = -alphaBetaMax(-DBL_MAX, -alpha, depth-1, copy, !player);
#ifdef PRINT_SCORES
printf(" <%c,%d> to ", cur->x1 + 'a', cur->y1 + 1);
printf("<%c,%d>", cur->x2 + 'a', cur->y2 + 1);
printf(" - score %f\n", score);
#endif
freeGame(copy);
if(board_count > MAX_BOARDS)
break;
if (score > alpha) {
alpha = score;
if (best != NULL) {
best->next = NULL;
free(best);
}
best = copyMove(*cur);
}
cur = cur->next;
}
firstMove = tmp;
freeMoves();
if(board_count > MAX_BOARDS) {
free(best);
return 0;
}
return best;
}
코드 검토에 오신 것을 환영합니다! 유감스럽게도이 사이트의 내용을 오해 한 것으로 보입니다. 게시 한 코드가 손상된 것 같습니다. - "가끔씩 만 제외하고는 효과가있는 것 같습니다."- 여기서 작업 코드 만 처리합니다. – RubberDuck