Магические битборды

Discussion in 'Машинное отделение' started by WinPooh, 7 Mar 2008.

  1. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.124
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Сделал генератор на магических битбордах. Копировать готовое решение от Pradu не хотелось, поэтому - полтора часа медитаций над PDF-ом, столько же на написание кода, и две ночи на самые сложные поля - A1 и H1 для ладьи (штук по 5 миллиардов псевдослучайных проб на каждое). Множители для остальных полей сгенерировались в течение минут.

    Вроде работает. Прирост скорости порядка 10%.
  2. дуп Учаcтник

    • Участник
    Member Since:
    11.09.2007
    Message Count:
    113
    Likes Received:
    0
    Репутация:
    0
    Location:
    Великий Новгород
    Оффлайн
    А нельзя ли объяснить, что такое "магические" битборды ? Это какие то особенные битборды ? Или может где почитать есть на эту тему, не в первый раз вижу это таинственное словосочетание, а что происходит - непонятно.
  3. WildCat Коршунов Игорь

    • Команда форума
    Member Since:
    04.05.2006
    Message Count:
    3.599
    Likes Received:
    4
    Репутация:
    0
    Location:
    Гомель
    Оффлайн
    Магия происходит. Простым смертным лучше не соваться. :)
  4. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.124
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Да всё просто. В двух словах, алгоритм такой.

    Надо найти по битборду с занятыми полями битборд с атаками ладьи (слона) с заданного поля.
    Для этого:

    1) Делаем AND битборда занятости с только теми полями, которые влияют на атаки. Для ладьи на любом поле битборд-маска состоит из 12 единиц. Например, для a1 это поля a2...a7, b1...g1 (поля a8 и h1 не входят, т.к. их атакованность ладьёй с a1 не зависит от того, стоит ли на них какая-нибудь фигура)
    2) Умножаем маскированный битборд на МАГИЧЕСКОЕ ЧИСЛО ДЛЯ ЛАДЬИ НА А1.
    3) Берём от произведения 12 старших разрядов (сдвигом).
    4) Получаем 12-разрядное число, которое используем как индекс в предвычисленной таблице атак.

    МАГИЧЕСКОЕ ЧИСЛО для каждого поля доски находим методом Монте-Карло, чтобы не было коллизий. Будет два массива, 64 числа для ладьи и 64 для слона. Маски для атак - тоже предвычисленные константы.

    Процедура умножения и сдвига имеет название "perfect hashing". Она тесно связана с одним из алгоритмов для поиска LSB.
  5. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.124
    Репутация:
    95
    Location:
    Москва
    Оффлайн
  6. дуп Учаcтник

    • Участник
    Member Since:
    11.09.2007
    Message Count:
    113
    Likes Received:
    0
    Репутация:
    0
    Location:
    Великий Новгород
    Оффлайн
    Спасибо. Очень интересно, надо поизучать. Да принцип я в общих чертах уже понял, не понял только при чем здесь "поиск LSB". Чего его искать то ?
    Code:
      LSB = Bb  &  -(long long)Bb;
  7. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.124
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    > LSB = Bb & -(long long)Bb;

    Это выражение даст только 64-БИТНОЕ число, хотя и весьма специального вида. А нужно - НОМЕР установленного бита. В диапазоне от 0 до 63. Т.е. нужно эти 64 специальных 64-битных числа захэшировать в диапазон таблицы. Вот для этого и нужен множитель и сдвиг.
  8. Bison Учаcтник

    • Участник
    Member Since:
    18.01.2008
    Message Count:
    49
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Поздравляю, 10% очень даже хороший результат. Хьятт писал, что прирост у него составил сущие копейки.
  9. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.124
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Видимо, у меня просто была не очень эффективная предыдущая реализация. Кроме того, влияние на скорость perft и на скорость анализа обычно разное - зависит от того, насколько оценочная функция нагружена поисками атак.

    Например, rotated bitboards у меня уменьшают скорость perft, но увеличивают скорость анализа.
  10. Bison Учаcтник

    • Участник
    Member Since:
    18.01.2008
    Message Count:
    49
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Кстати, ни Греко ли сейчас самый быстрый движок?
  11. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.124
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Уверен, что не Греко. Perft у меня вообще очень медленный (см. соответствующую ветку).
    А knps большие частично из-за того, что в ФВ отсечений мало.
  12. Bison Учаcтник

    • Участник
    Member Since:
    18.01.2008
    Message Count:
    49
    Likes Received:
    0
    Репутация:
    0
    Оффлайн
    Какого размера используются массивы с атаками ладей и слонов? 102400 и 5248?
  13. TopicStarter Overlay

    WinPooh В.М.

    • Команда форума
    Member Since:
    13.02.2006
    Message Count:
    9.492
    Likes Received:
    3.124
    Репутация:
    95
    Location:
    Москва
    Оффлайн
    Всё по-простому, без преждевременных оптимизаций.
    64 * (2^12) для ладей и 64 * (2^10) для слонов.
    Знаю, что можно меньше, но нет времени на долгий поиск коэффициентов. Готовые брать не хочу принципиально :)

    Думаю, что можно будет попробовать разбить массивы для ладей по направлениям - для экономии места.

Share This Page