void NelderMead::evaluateTestPoint(TestPoint *testPoint) { setTestPointParameters(testPoint); double eval = evaluationFunction(evaluatingObject); testPoint->second = eval; }
/* * The minimax AI algorithm. */ int alphabeta(PossibleMove* possibleMove, int depth, int player, int alpha, int beta){ int (*evaluationFunction)(Board*, int, int) = (maxRecursionDepth == BEST)? &Board_getBetterScore: &Board_getScore; int thisBoardScore = evaluationFunction(possibleMove->board, turn, player); // maximum depth reached or game is over or allocation error occurred in Board_getScore if (depth == 1 || thisBoardScore == 10000 || thisBoardScore == -10000 || thisBoardScore == -10001){ return thisBoardScore; } Board* board = possibleMove->board; LinkedList* possibleMoves = Board_getPossibleMoves(board, player); if (!possibleMoves){ return -10001; } //terminal node if (LinkedList_length(possibleMoves) == 0){ LinkedList_free(possibleMoves); return thisBoardScore; } //single child node if (LinkedList_length(possibleMoves) == 1){ PossibleMove* onlyMove = PossibleMoveList_first(possibleMoves); int score = evaluationFunction(onlyMove->board, turn, player); LinkedList_free(possibleMoves); return score; } int extremum = (player == turn)? INT_MIN : INT_MAX; Iterator iterator; Iterator_init(&iterator, possibleMoves); while (Iterator_hasNext(&iterator)) { PossibleMove* currentPossibleMove = (PossibleMove*)Iterator_next(&iterator); int score = alphabeta(currentPossibleMove, depth-1, !player, alpha, beta); if (score == -10001){ //allocation error occured extremum = score; break; } if ( (player != turn && score < extremum) || (player == turn && score > extremum) || (rand()%2 && score == extremum) ){ extremum = score; } //game over - no need to evaluate further moves // if (extremum == 10000 || extremum == -10000){ // break; // } //alpha-beta pruning if (turn == player){ alpha = (score > alpha)? score: alpha; if (alpha >= beta){ break; } } else{ beta = (score < beta)? score: beta; if (beta <= alpha){ break; } } } LinkedList_free(possibleMoves); return extremum; }