Почему моя реализация так медленна по сравнению с другими?C++

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

Сообщение Anonymous »

Я сейчас работаю над шахматным двигателем, используя C ++. Сначала я начал с Python, но это было слишком медленно. Затем я перешел на C, но библиотека, которую я использовал, не была великолепна. Теперь я использую C ++ (с Lib от https://disservin.github.io/chess-libra ... /move.html), но кажется, что в моем коде есть ошибка, потому что вывод в настоящее время является:
Welcome to the Chess Engine!
Enter depth:
5

Testing position: r3k2r/p1ppqpb1/Bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPB1PPP/R3K2R b KQkq - 0 10
Best move overall: -125
Depth: 1 | Nodes: 37 | Time: 0.00164008s | Score: -125 | Score de base 445
Best move overall: 445
Depth: 2 | Nodes: 452 | Time: 0.0153926s | Score: 445 | Score de base 445
Best move overall: -65
Depth: 3 | Nodes: 3709 | Time: 0.0638264s | Score: -65 | Score de base 445
1
Best move overall: 440
Depth: 4 | Nodes: 28595 | Time: 0.269176s | Score: 440 | Score de base 445
Best move overall: 55
Depth: 5 | Nodes: 239462 | Time: 2.36422s | Score: 55 | Score de base 445
< /code>
, что действительно странно, поскольку мой код должен искать до глубины 5 примерно за 0,2 секунды. Я видел в видео приключений из Себастьяна Лаг, которое, с обрезкой и заказами альфа-бета и перемещением, он уже оценивает ту же позицию всего за 0,02 секунды. Я действительно запутался: я внедрил таблицу транспозиции, Killer Moves, MVV-LVA и альфа-бета-обрезка-но мое выступление даже не близко к его. И он использует C#, даже C ++. < /P>
#include "chess.hpp"

#include
#include
#include
#include
#include

const long long TABLE_SIZE = 1= piece_value(attacking_piece))
{
return 1;
}else
{
return -1;
}
}

int quiescence(Board& b, int alpha, int beta)
{
nodesExplored++;
int initEval = evaluate(b);
if (b.sideToMove() != Color::WHITE) initEval = -initEval;
if (initEval >= beta) return initEval;
if (initEval > alpha) alpha = initEval;
Movelist moves;
movegen::legalmoves(moves, b);
for (auto it = moves.begin(); it != moves.end(); ++it)
{
Move m = *it;
if (SEE(b,m) < 0) continue;
b.makeMove(m);
int score = -quiescence(b, -beta, -alpha);
b.unmakeMove(m);

if (score >= beta) return score;

if (score > alpha) alpha = score;
}
return alpha;
}

int search(Board& b, int depth, int alpha, int beta)
{
int alphaOrig = alpha;
nodesExplored++;
uint64_t key = b.zobrist();
int idx = index(key);
Entry& entry = Table[idx];
if (entry.isValid && entry.depth >= depth && entry.key == key)
{
if (entry.flag == EXACT)
{
return entry.score;
}
else if (entry.flag == LOWERBOUND && entry.score >= beta)
{
return entry.score;
}
else if (entry.flag == UPPERBOUND && entry.score value)
{
value = score;
bestmove = ttMove;
}
alpha = std::max(alpha,value);
if (alpha >= beta)
{
if (!b.isCapture(ttMove))
{
if (killerMoves[depth][0] != ttMove && killerMoves[depth][1] != ttMove)
{
killerMoves[depth][1] = killerMoves[depth][0];
killerMoves[depth][0] = ttMove;
}
}
return value;
}
}
OrderMoves(moves, b, depth, ttMove);

for (auto it = moves.begin(); it != moves.end(); ++it)
{
Move m = *it;
b.makeMove(m);
int score = -search(b,depth-1, -beta, -alpha);
b.unmakeMove(m);
if (score >value)
{
value = score;
bestmove = m;
}
alpha = std::max(alpha,value);
if (alpha >= beta)
{
if (!b.isCapture(m))
{
if (killerMoves[depth][0] != m && killerMoves[depth][1] != m)
{
killerMoves[depth][1] = killerMoves[depth][0];
killerMoves[depth][0] = m;
}
}
break;
}
}
//std::cout

Подробнее здесь: https://stackoverflow.com/questions/796 ... -to-others
Ответить

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

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

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

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

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