Я сейчас работаю над шахматным двигателем, используя 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
Почему моя реализация так медленна по сравнению с другими? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1748805099
Anonymous
Я сейчас работаю над шахматным двигателем, используя C ++. Сначала я начал с Python, но это было слишком медленно. Затем я перешел на C, но библиотека, которую я использовал, не была великолепна. Теперь я использую C ++ (с Lib от https://disservin.github.io/chess-library/pages/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
Подробнее здесь: [url]https://stackoverflow.com/questions/79647033/why-is-my-implementation-so-slow-compared-to-others[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия