/** * Evaluates the position. * * @param position the position. * @return the evaluation value in centipawns. */ int Evaluation::evaluate(Position& position) { // Initialize int myColor = position.activeColor; int oppositeColor = Color::opposite(myColor); int value = 0; // Evaluate material int materialScore = (evaluateMaterial(myColor, position) - evaluateMaterial(oppositeColor, position)) * materialWeight / MAX_WEIGHT; value += materialScore; // Evaluate mobility int mobilityScore = (evaluateMobility(myColor, position) - evaluateMobility(oppositeColor, position)) * mobilityWeight / MAX_WEIGHT; value += mobilityScore; // Add Tempo value += TEMPO; assert(std::abs(value) < Value::CHECKMATE_THRESHOLD); return value; }
int Evaluation::evaluate(Position& position, bool heavy, int beta, bool dumpoutput) { // Initialize int myColor = position.activeColor; int oppositeColor = Color::opposite(myColor); int value = 0; // Evaluate material int mymaterial = evaluateMaterial(myColor, position); int materialScore = (mymaterial - evaluateMaterial(oppositeColor, position)) * materialWeight / MAX_WEIGHT; value += materialScore; if (dumpoutput) { std::cout << " materialscore: " << mymaterial * materialWeight / MAX_WEIGHT << " " << materialScore; } if (value >= beta + BETA_THRESHOLD) { return value; } if (heavy) { double materialRatio =(double) mymaterial / maxMaterial; // Evaluate mobility int mymobility = evaluateMobility(myColor, position); int mobilityScore = (mymobility - evaluateMobility(oppositeColor, position)) * mobilityWeight / MAX_WEIGHT; value += mobilityScore; if (dumpoutput) { std::cout << " mobilityscore: " << mymobility * mobilityWeight / MAX_WEIGHT << " " << mobilityScore; } // Evaluate center control int mycentre = evaluateCenter(myColor, position); int centerScore = (mycentre - evaluateCenter(oppositeColor, position)) * materialRatio * centerWeight / MAX_WEIGHT; value += centerScore; if (dumpoutput) { std::cout << " centrescore: " << int (mycentre * materialRatio * centerWeight / MAX_WEIGHT) << " " << centerScore; } // Evaluate Pawn structure int mypawn = evaluatePawn(myColor, position); int pawnScore = (mypawn - evaluatePawn(oppositeColor, position)) * pawnStructureWeight / MAX_WEIGHT; value += pawnScore; if (dumpoutput) { std::cout << " pawnscore: " << int(mypawn * pawnStructureWeight / MAX_WEIGHT) << " " << pawnScore; } // Evaluate King Safety int myking = evaluateKingSafety(myColor, position); int kingSafetyScore = (myking - evaluateKingSafety(oppositeColor, position)) * materialRatio * kingSafetyWeight / MAX_WEIGHT; value += kingSafetyScore; if (dumpoutput) { std::cout << " kingscore: " << int(myking * materialRatio * kingSafetyWeight / MAX_WEIGHT) << " " << kingSafetyScore; } } // Add Tempo value += TEMPO; assert(std::abs(value) < Value::CHECKMATE_THRESHOLD); return value; }
double Evaluation::getMaterialRatio(int color, Position& position) { int myColor = position.activeColor; int mymaterial = evaluateMaterial(myColor, position); return mymaterial / maxMaterial; }