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

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

  1. Counter Учаcтник

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

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

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

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

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Главное в новой не наделать всего этого :)
  4. Counter Учаcтник

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

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

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    10x12, у меня и в шашках аналог этого представления.
    Ну и списки фигур сделаю...
  6. Vlad_Imir Новичок

    • Новичок
    Рег.:
    12.11.2006
    Сообщения:
    77
    Симпатии:
    284
    Репутация:
    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 Новичок

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

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    [​IMG]
  9. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Народ, я в шоке. Добавил проверку на шах - скорость генератора упала в 4 раза :(
  10. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Сделаешь функции исполнения ходов еще упадет.
  11. ProstoTak Старожил

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

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

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

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

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

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

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

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
  17. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
  18. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
  19. ChessTerminator75 Андрей

    • Участник
    Рег.:
    22.05.2007
    Сообщения:
    121
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Челябинск
    Оффлайн
    ProstoTak
    тебя понял
    надо будет посмотреть. :)
    я всегда рад замечаниям и конструктивной критике.

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

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Провёл оптимизацию проверки на шах, скорость возросла с 1 млн.ходов/сек до 1,4 млн.ходов/сек. Потом ещё и отказался от копирования позиции, скорость возросла до 2,4 млн.ходов/сек. Это всё на 950 целероне.
  21. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.709
    Симпатии:
    50
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    покажи движок :)
  22. ProstoTak Старожил

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

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Это уже вполне неплохо.
  24. ProstoTak Старожил

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

    Кто больше? :)
  25. WinPooh В.М.

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

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    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 Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Первых три полухода по цифрам совпадают с твоими. А дальше расхождение. Будем искать :)
  28. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    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 Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Так это он двуядерный? И если да то ты используешь двуядерность?
  30. ProstoTak Старожил

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

    • Участник
    Рег.:
    23.10.2006
    Сообщения:
    98
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Гонду-Раша
    Оффлайн
    Очень часто ошибки в генераторах ходов бывают с правилом взятия на проходе и рокировкой
  32. WinPooh В.М.

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

    • Участник
    Рег.:
    23.10.2006
    Сообщения:
    98
    Симпатии:
    0
    Репутация:
    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 В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Очень быстро. Хэш для вычислений используется (у меня без хэша)?
  35. варяг Учаcтник

    • Участник
    Рег.:
    23.10.2006
    Сообщения:
    98
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Гонду-Раша
    Оффлайн
    Нет, хэш не используется

Поделиться этой страницей