Основные принципы генератора ходов (Bitboard и 0x88)

Тема в разделе "Машинное отделение", создана пользователем Chemer, 30 ноя 2006.

  1. Counter
    Оффлайн

    Counter Учаcтник

    Репутация:
    0
    Вот у меня Perft(6) в начальной позиции 33 секунды работает. на Pentium-M 1.7 (генератор на битбордах), пробовал на C++ переписать стал за 20 секунд работать.

    NS, а ты время Perft мерял? Может у тебя не генератор медленный, а что-нибудь еще.
     
  2. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    У меня достаточно быстрый генератор :)
    Скорость я теряю на проверке на шах и проверке на легальность в ФВ (постоянно забывал убрать), и на том что в структуре позиции при взятии не уменьшаю материал - в итоге в проверке на шах проверяет на шах дальнобойными фигурами даже в пешечных эндшпилях, и перед оценкой (и Null Move) я сначала пробегаюсь по доске чтоб определить стадию партии.

    Исправить это можно очень быстро - нужно только дописать Move/UnMove и убрать две лишних проверки в ФВ, но мне честно говоря влом :) всё-равно пишу новую версию "с нуля"
     
  3. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Главное в новой не наделать всего этого :)
     
  4. Counter
    Оффлайн

    Counter Учаcтник

    Репутация:
    0
    Я всегда проверяю позицию на легальность (и в ФВ и не в ФВ). Скорость надо, конечно, профайлером смотреть. У меня 20% всего времени работает функция int PopFirstOne(ref UInt64 value), которая очищает первый ненулевой бит и возвращает его позицию. На C++ со вставкой на ассемблере работает побыстрее.

    А "с нуля" пишешь снова под 0x88 или решил другое представление попробовать?
     
  5. NS
    Оффлайн

    NS Нефёдов Сергей баннер

    Репутация:
    3
    10x12, у меня и в шашках аналог этого представления.
    Ну и списки фигур сделаю...
     
  6. Vlad_Imir
    Оффлайн

    Vlad_Imir Новичок

    Репутация:
    20
    Насчет проверки возможности хода (не попадает ли наш король под шах при ходе).
    В частном случае, когда ход не королем и мы ходим не королем (это чаще всего и происходит) я делаю следующее:

    Если у противника не дальнобойных фигур - проверять нечего, открытого шаха быть не может.
    Если фигура , которой ходим не находится на одной вертикали, горизонтали. диагонали с королем - проверять тоже нечего.
    Если фигурв находится на одной вертикади, горизонтали с королем, но ферзей и ладей нет - прверять не надо.
    Если фигура находится на одной диагонали с королем, но слонов и ферзей у противника нет - проверять не надо.


    Так как я использую битборды, то возможны дополнительные (быстрые проверки)

    Код:
        INT_64 m_Candidats = 0;
        INT_64 our_pieces_without_king = our_board->Pieces^our_board->King;
        INT_64 lvector;
        INT_64 threats;
    
        threats = enemy_board->QueenRook;
        if (threats) { 
            if (RookAttacks[king] & threats) {
                for (int i = FIRST_DIRECTION - 1; i <= FORTH_DIRECTION - 1; i ++) {
                    lvector = Vectors[king][i];
                    if (lvector & threats) 
                        m_Candidats |= (lvector & our_pieces_without_king);
                }
            }
        }
    
        threats = enemy_board->QueenBishop;
        if (threats) {
            if (BishopAttacks[king] & threats) {
                for (int i = FIFTH_DIRECTION - 1; i <= EIGHTH_DIRECTION - 1; i ++) {
                    lvector = Vectors[king][i];
                    if (lvector & threats)
                        m_Candidats |= (lvector & our_pieces_without_king);
                }
            }
        }
    RookAttacks, BishopAttacks, Vectors - просчитываются при загрузке.
    Таким образом m_Candidats содержит фигуры, которые надо по полной программе проверять. Остальные не проверяются.
     
  7. Vlad_Imir
    Оффлайн

    Vlad_Imir Новичок

    Репутация:
    20
    <В частном случае, когда ход не королем и мы ходим не королем
    Зарапортавался!
    Должно быть "В частном случае, когда ход не королем и мы не под шахом..."
     
  8. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    [​IMG]
     
  9. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Народ, я в шоке. Добавил проверку на шах - скорость генератора упала в 4 раза :(
     
  10. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Сделаешь функции исполнения ходов еще упадет.
     
  11. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Добил кажись генератор. Уже и все проверки на все шахи, и копирование позиции, и выполнение очередного хода на копии. В результате на моём 950 целероне имею чуть более 1 миллиона ходов в секунду. Что скажете?
     
  12. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Попробуй не копировать позицию, а обновлять и потом откатывать. Должно получиться быстрее. Но в целом, неплохая скорость, ИМХО. У Греки где-то так же, если пересчитать на частоту Целерона.
     
  13. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Ну как же не копировать? Когда нужно передавать позицию в глубину на следующий полуход. Я же замахаюсь туда сюда откатывать. Или не замахаюсь? :) При проверке на шах я на рабочей доске делаю ход а потом откатываю. Но при передаче позиции на следующий полуход ИМХО нужно копировать.
     
  14. ChessTerminator75
    Оффлайн

    ChessTerminator75 Андрей

    Репутация:
    0
    Точно не нужно.
    У тебя будет две функции в одной прямой ход
    а в другой возврат.
    Это хорошо и для скорости и для кеша.

    Скорость оценить невозможно пока не напишешь
    какой у тебя оценщик.

    P.S. ProstoTak зайди на мой сайт почитай дневники :):)
     
  15. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Спасибо. Почитал, посмотрел, поскачивал :)
    Могу выссказать замечание. Ты проверяешь нет ли выхода за пределы массива при ходе пешкой вперед. Этого делать не нужно, ибо пешка с доски соскочить никогда не может :)
     
  16. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
  17. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
  18. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
  19. ChessTerminator75
    Оффлайн

    ChessTerminator75 Андрей

    Репутация:
    0
    ProstoTak
    тебя понял
    надо будет посмотреть. :)
    я всегда рад замечаниям и конструктивной критике.

    WinPooh
    давно хотел сказать:
    Спасибо за ссылки!
    они здорово помогают.
     
  20. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Провёл оптимизацию проверки на шах, скорость возросла с 1 млн.ходов/сек до 1,4 млн.ходов/сек. Потом ещё и отказался от копирования позиции, скорость возросла до 2,4 млн.ходов/сек. Это всё на 950 целероне.
     
  21. krey
    Оффлайн

    krey Михаил Кройтор Команда форума Команда форума

    Репутация:
    1
    покажи движок :)
     
  22. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Шо, очередная волна неверия? :)
    Во первых буду считать законченным когда перебор сделаю, а во вторых сильно ещё подумаю стоит ли открывать исходники :p
     
  23. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Это уже вполне неплохо.
     
  24. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Сделал перебор и начал перебирать начальную позицию. Докопал до шести полуходов на своём 950 целероне. Вот что получилось.
    [c]
    (4) 0.11 сек, 206587 ходов, 197265 оценок, 1880 тыс. ходов/сек
    (5) 3.63 сек, 5071194 ходов, 4864615 оценок, 1398 тыс. ходов/сек
    (6) 87.53 сек, 124084889 ходов, 119014050 оценок, 1418 тыс. ходов/сек
    [/c]

    Кто больше? :)
     
  25. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Что-то здесь не так. Цифры очень незнакомые. Как ты считаешь ходы и оценки?
    Хотелось бы увидеть также числа для глубины 1, 2 и 3 - это поможет прояснить ошибку, если она тут есть (а она тут есть).
     
  26. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Числа должны совпадать вот с этими: http://mypage.bluewin.ch/romanhartmann/perft.html

    depth nodes totalnodes
    1 20 20
    2 400 420
    3 8902 9322
    4 197281 206603
    5 4865609 5072212
    6 119060324 124132536
    7 3195901860 3320034396
     
  27. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Первых три полухода по цифрам совпадают с твоими. А дальше расхождение. Будем искать :)
     
  28. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    GreKo 5.3
    Athlon X2 4400+
    2.21 GHz

    Из начальной позиции:

    perft 5 - 1.11 sec, 4383 knps
    perft 6 - 27.03 sec, 4404 knps

    Генератор и исполнитель ходов - те же самые, что в основном поиске, т.е. с инкрементальным обновлением хэша и материала, сохранением информации для детектора повторений и т.д.
     
  29. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Так это он двуядерный? И если да то ты используешь двуядерность?
     
  30. ProstoTak
    Оффлайн

    ProstoTak Старожил

    Репутация:
    1
    Как считаешь на какой коэфициент нужно домножить мой проц чтобы с твоим сравняться? Если в 2 раза у тебя круче проц то ты меня в 1,5 обходишь по генератору.
     
  31. варяг
    Оффлайн

    варяг Учаcтник

    Репутация:
    0
    Очень часто ошибки в генераторах ходов бывают с правилом взятия на проходе и рокировкой
     
  32. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Он двухъядерный, но это не используется - программа однопоточная. Так что, наверное, можно просто поделить частоты, 2.21 / 0.9 = 2.46
    Хотя тут ещё скорость памяти, на мой взгляд, сильно влияет. И как её учесть, совершенно неясно.
     
  33. варяг
    Оффлайн

    варяг Учаcтник

    Репутация:
    0
    Вот мои результаты
    Athlon XP 3200+
    2.01 GHz

    Из начальной позиции:

    perft 4
    Nodes: 197281
    Time: 7

    perft 5
    Nodes: 4865609
    Time: 101

    perft 6
    Nodes: 119060324
    Time: 2493

    Время в миллисекундах

    Генератор и исполнитель ходов - те же самые, что в основном поиске, т.е. с инкрементальным обновлением хэша и материала, сохранением информации для детектора повторений и т.д.
     
  34. WinPooh
    Оффлайн

    WinPooh В.М. Команда форума

    Репутация:
    95
    Очень быстро. Хэш для вычислений используется (у меня без хэша)?
     
  35. варяг
    Оффлайн

    варяг Учаcтник

    Репутация:
    0
    Нет, хэш не используется