Как я могу выполнять поиск в C++ как можно быстрее?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как я могу выполнять поиск в C++ как можно быстрее?

Сообщение Anonymous »

Я пытаюсь создать шахматного бота. Я использую битборды для представления доски и фигур. Я читал в Интернете из нескольких источников, что использование PEXT для поиска скользящих фрагментов делает ваш код очень быстрым. Я реализовал свою собственную версию, и она на самом деле примерно на 25 % медленнее, чем моя первоначальная реализация (которая рассчитывала каждый шаблон атаки с помощью логических операций).
Это новый код, который использует PEXT для рассчитать схему атаки:

Код: Выделить всё

uint64_t Move_lookup::get_rook_moves(int index, uint64_t all_pieces) {
int index2 = _pext_u64(all_pieces, rook_masks[index]);
return rook_moves[index][index2];
}
Моя таблица поиска представляет собой двумерный вектор. Первый индекс — это начальный индекс фигуры, а второй индекс — это конкретная схема атаки, зависящая от расположения других фигур. Этот индекс получается с помощью PEXT. Вот как я определяю свою таблицу поиска:

Код: Выделить всё

std::vector rook_moves;
И это была моя первоначальная реализация:

Код: Выделить всё

uint64_t Board::get_rook_moves(uint64_t* b, pieceColour colour, int n) {
// We must perform the operation on the set the function was called with
uint64_t rooks = *b;
isolate_piece(&rooks, n); // This gets rid of all the 1's we are not interested in in rooks

// Get all enemy pieces
uint64_t enemy_pieces = all_pieces(invert_colour(colour));

// Combined pieces for obstacle detection
uint64_t black_white_pieces = all_pieces(colour) | enemy_pieces;

uint64_t attacks = 0ULL;

// We need to look in all four straight directions (N,E,S,W) until we hit the edge of the board or another piece
// North
uint64_t move = rooks;
while (move & NOT_RANK_8) {  // Continue while not on the last rank
move = 1;  // Move one file right
if (move & black_white_pieces) {  // Stop if a piece is encountered
if (move & enemy_pieces) attacks |= move;  // If enemy piece, include in attacks
break;
}
attacks |= move;  // Add square to attacks
}

// South
move = rooks;
while (move & NOT_RANK_1) {  // Continue while not on the first rank
move >>= 8;  // Move one rank down
if (move & black_white_pieces) {  // Stop if a piece is encountered
if (move & enemy_pieces) attacks |= move;  // If enemy piece, include in attacks
break;
}
attacks |= move;  // Add square to attacks
}

// West
move = rooks;
while (move & NOT_A_FILE) {  // Continue while not on the A file
move 

Подробнее здесь: [url]https://stackoverflow.com/questions/79151644/how-can-i-make-lookups-in-c-as-fast-as-possible[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»