// ******************************************************************* // (C) Copyright 2013 Leiden Institute of Advanced Computer Science // Universiteit Leiden // All Rights Reserved // ******************************************************************* // Dou Shou Qi (engine) // ******************************************************************* // FILE INFORMATION: // File: evaluation.h // Author: Jonathan K. Vis // Revision: 1.01a // Date: 2013/04/05 // ******************************************************************* // DESCRIPTION: // Defines for each piece a static development score for each // location of the board and a negative score when a piece is // captured (static relative piece value). // Values are taken from: ``Discovering and Searching Loosely // Coupled Subproblems in Dou Shou Qi'', Joseph Burnett, 2010. // ******************************************************************* #if !defined(__evaluation_h__) #define __evaluation_h__ #include "../core/position.h" static int const DEVELOPMENT[16][64] = { { 11, 13, 50, 100, 50, 13, 13, 11, 12, 13, 50, 13, 13, 13, 10, 11, 11, 13, 13, 13, 13, 8, 9, 9, 11, 12, 12, 13, 8, 9, 9, 11, 12, 12, 12, 8, 9, 9, 10, 12, 12, 11, 8, 8, 8, 9, 10, 10, 10, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 0, 8, 8, 8, -500 }, // WHITE_RAT { 8, 8, 8, 0, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 10, 10, 10, 9, 8, 8, 8, 11, 12, 12, 10, 9, 9, 8, 12, 12, 12, 11, 9, 9, 8, 13, 12, 12, 11, 9, 9, 8, 13, 13, 13, 13, 11, 11, 10, 13, 13, 13, 50, 13, 12, 11, 13, 13, 50, 100, 50, 13, 11, -500 }, // BLACK_RAT { 11, 15, 50, 100, 50, 15, 11, 11, 11, 15, 50, 15, 11, 11, 10, 11, 11, 15, 11, 11, 10, 10, 0, 0, 10, 0, 0, 8, 10, 0, 0, 8, 0, 0, 8, 10, 0, 0, 8, 0, 0, 8, 10, 10, 10, 8, 8, 8, 8, 13, 10, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, -200 }, // WHITE_CAT { 8, 8, 8, 0, 8, 8, 8, 8, 8, 8, 8, 8, 10, 13, 8, 8, 8, 8, 10, 10, 10, 8, 0, 0, 8, 0, 0, 10, 8, 0, 0, 8, 0, 0, 10, 8, 0, 0, 10, 0, 0, 10, 10, 11, 11, 15, 11, 11, 10, 11, 11, 15, 50, 15, 11, 11, 11, 15, 50, 100, 50, 15, 11, -200 }, // BLACK_CAT { 11, 15, 50, 100, 50, 15, 11, 10, 11, 15, 50, 15, 11, 10, 9, 10, 11, 15, 11, 10, 9, 9, 0, 0, 10, 0, 0, 9, 8, 0, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 0, 8, 8, 8, 10, 8, 8, 8, 8, 8, 12, 13, 8, 8, 8, 8, 8, 12, 12, 0, 8, 8, 8, -300 }, // WHITE_WOLF { 8, 8, 8, 0, 12, 12, 8, 8, 8, 8, 8, 13, 12, 8, 8, 8, 8, 8, 10, 8, 8, 8, 0, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 0, 8, 9, 0, 0, 10, 0, 0, 9, 9, 10, 11, 15, 11, 10, 9, 10, 11, 15, 50, 15, 11, 10, 11, 15, 50, 100, 50, 15, 11, -300 }, // BLACK_WOLF { 11, 15, 50, 100, 50, 15, 11, 10, 11, 15, 50, 15, 11, 10, 9, 10, 11, 15, 11, 10, 9, 9, 0, 0, 10, 0, 0, 9, 8, 0, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 13, 10, 8, 8, 8, 8, 0, 12, 12, 8, -400 }, // WHITE_DOG { 8, 12, 12, 0, 8, 8, 8, 8, 10, 13, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 8, 0, 0, 8, 8, 0, 0, 8, 0, 0, 8, 9, 0, 0, 10, 0, 0, 9, 9, 10, 11, 15, 11, 10, 9, 10, 11, 15, 50, 15, 11, 10, 11, 15, 50, 100, 50, 15, 11, -400 }, // BLACK_DOG { 14, 15, 50, 100, 50, 15, 14, 13, 14, 15, 50, 15, 14, 13, 13, 13, 14, 15, 14, 13, 13, 12, 0, 0, 15, 0, 0, 12, 11, 0, 0, 14, 0, 0, 11, 10, 0, 0, 13, 0, 0, 10, 9, 9, 9, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 9, 9, 9, -500 }, // WHITE_PANTHER { 9, 9, 9, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 9, 9, 9, 10, 0, 0, 13, 0, 0, 10, 11, 0, 0, 14, 0, 0, 11, 12, 0, 0, 15, 0, 0, 12, 13, 13, 14, 15, 14, 13, 13, 13, 14, 15, 50, 15, 14, 13, 14, 15, 50, 100, 50, 15, 14, -500 }, // BLACK_PANTHER { 25, 30, 50, 100, 50, 30, 25, 25, 25, 30, 50, 30, 25, 25, 18, 20, 20, 30, 20, 20, 18, 15, 0, 0, 15, 0, 0, 15, 15, 0, 0, 15, 0, 0, 15, 15, 0, 0, 15, 0, 0, 15, 14, 16, 16, 14, 16, 16, 14, 12, 14, 12, 12, 12, 12, 12, 10, 12, 12, 0, 12, 12, 10, -800 }, // WHITE_TIGER { 10, 12, 12, 0, 12, 12, 10, 12, 12, 12, 12, 12, 14, 12, 14, 16, 16, 14, 16, 16, 14, 15, 0, 0, 15, 0, 0, 15, 15, 0, 0, 15, 0, 0, 15, 15, 0, 0, 15, 0, 0, 15, 18, 20, 20, 30, 20, 20, 18, 25, 25, 30, 50, 30, 25, 25, 25, 30, 50, 100, 50, 30, 25, -800 }, // BLACK_TIGER { 25, 30, 50, 100, 50, 30, 25, 25, 25, 30, 50, 30, 25, 25, 18, 20, 20, 30, 20, 20, 18, 15, 0, 0, 15, 0, 0, 15, 15, 0, 0, 15, 0, 0, 15, 15, 0, 0, 15, 0, 0, 15, 14, 16, 16, 14, 16, 16, 14, 12, 12, 12, 12, 12, 14, 12, 10, 12, 12, 0, 12, 12, 10, -900 }, // WHITE_LION { 10, 12, 12, 0, 12, 12, 10, 12, 14, 12, 12, 12, 12, 12, 14, 16, 16, 14, 16, 16, 14, 15, 0, 0, 15, 0, 0, 15, 15, 0, 0, 15, 0, 0, 15, 15, 0, 0, 15, 0, 0, 15, 18, 20, 20, 30, 20, 20, 18, 25, 25, 30, 50, 30, 25, 25, 25, 30, 50, 100, 50, 30, 25, -900 }, // BLACK_LION { 25, 30, 50, 100, 50, 30, 25, 25, 25, 30, 50, 30, 25, 25, 18, 20, 20, 30, 20, 20, 18, 16, 0, 0, 16, 0, 0, 16, 14, 0, 0, 14, 0, 0, 14, 12, 0, 0, 12, 0, 0, 12, 10, 15, 14, 14, 14, 14, 12, 11, 14, 11, 11, 11, 11, 11, 11, 11, 11, 0, 11, 11, 11, -1000 }, // WHITE_ELEPHANT { 11, 11, 11, 0, 11, 11, 11, 11, 11, 11, 11, 11, 14, 11, 12, 14, 14, 14, 14, 15, 10, 12, 0, 0, 12, 0, 0, 12, 14, 0, 0, 14, 0, 0, 14, 16, 0, 0, 16, 0, 0, 16, 18, 20, 20, 30, 20, 20, 18, 25, 25, 30, 50, 30, 25, 25, 25, 30, 50, 100, 50, 30, 25, -1000 } // BLACK_ELEPHANT }; // DEVELOPMENT static inline int evaluate(Position const &position) { static int const factor[2] = {-1, 1}; return factor[position.is_white_turn()] * (DEVELOPMENT[WHITE_RAT][position.piece(WHITE_RAT)] + -DEVELOPMENT[BLACK_RAT][position.piece(BLACK_RAT)] + DEVELOPMENT[WHITE_CAT][position.piece(WHITE_CAT)] + -DEVELOPMENT[BLACK_CAT][position.piece(BLACK_CAT)] + DEVELOPMENT[WHITE_WOLF][position.piece(WHITE_WOLF)] + -DEVELOPMENT[BLACK_WOLF][position.piece(BLACK_WOLF)] + DEVELOPMENT[WHITE_DOG][position.piece(WHITE_DOG)] + -DEVELOPMENT[BLACK_DOG][position.piece(BLACK_DOG)] + DEVELOPMENT[WHITE_PANTHER][position.piece(WHITE_PANTHER)] + -DEVELOPMENT[BLACK_PANTHER][position.piece(BLACK_PANTHER)] + DEVELOPMENT[WHITE_TIGER][position.piece(WHITE_TIGER)] + -DEVELOPMENT[BLACK_TIGER][position.piece(BLACK_TIGER)] + DEVELOPMENT[WHITE_LION][position.piece(WHITE_LION)] + -DEVELOPMENT[BLACK_LION][position.piece(BLACK_LION)] + DEVELOPMENT[WHITE_ELEPHANT][position.piece(WHITE_ELEPHANT)] + -DEVELOPMENT[BLACK_ELEPHANT][position.piece(BLACK_ELEPHANT)]); } // evaluate #endif