コード例 #1
0
ファイル: evaluation.cpp プロジェクト: atispor/pulse
int Evaluation::evaluateMobility(int color, Position& position) {
  assert(Color::isValid(color));

  int knightMobility = 0;
  for (auto squares = position.pieces[color][PieceType::KNIGHT].squares; squares != 0; squares = Bitboard::remainder(squares)) {
    int square = Bitboard::next(squares);
    knightMobility += evaluateMobility(color, position, square, Square::knightDirections);
  }

  int bishopMobility = 0;
  for (auto squares = position.pieces[color][PieceType::BISHOP].squares; squares != 0; squares = Bitboard::remainder(squares)) {
    int square = Bitboard::next(squares);
    bishopMobility += evaluateMobility(color, position, square, Square::bishopDirections);
  }

  int rookMobility = 0;
  for (auto squares = position.pieces[color][PieceType::ROOK].squares; squares != 0; squares = Bitboard::remainder(squares)) {
    int square = Bitboard::next(squares);
    rookMobility += evaluateMobility(color, position, square, Square::rookDirections);
  }

  int queenMobility = 0;
  for (auto squares = position.pieces[color][PieceType::QUEEN].squares; squares != 0; squares = Bitboard::remainder(squares)) {
    int square = Bitboard::next(squares);
    queenMobility += evaluateMobility(color, position, square, Square::queenDirections);
  }

  return knightMobility * 4
      + bishopMobility * 5
      + rookMobility * 2
      + queenMobility;
}
コード例 #2
0
ファイル: evaluation.cpp プロジェクト: atispor/pulse
/**
 * 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;
}
コード例 #3
0
ファイル: Evaluation.cpp プロジェクト: Hava842/martonchess
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;
}