Представление позиции

Тема в разделе "Машинное отделение", создана пользователем atoku, 4 июл 2006.

  1. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    Интересно было посмотреть, что люди применяют для представления позиции. Судя по всему, сейчас два основных подхода: 0x88 и бинборды (имени Хьятта). А что еще эффективное придумано? Да и эти два подхода хочется обсудить не на уровне, как в статье Хьятта, а на уровне всех тонкостей именно приложений.

    Я знаю, что NS работает с 0x88. На нем же написан Фрукт. Крафтя использует бинборды и не сильно вырвалась (хотя и прибавила) на Оптеронах. Я понял так, что оценочная функция считается все равно дольше (чем генерация ходов, которая впрямую связана с представлением позиции) и простота 0x88 дороже скорости бинбордов (которая к тому же сомнительна). Однако Хьятт уверяет, что ОФ лучше тоже на бинбордах... Так ли это?

    Хочется почитать мнения!
     
  2. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    не бинборды а битборды :) от bitboard
    на 64-битниках битборды однозначно быстрей работают. а в целом все зависит от общего устройства программы + квалификация программиста - битборды сложней программить, так что здесь 0х88 выигрывает.
    я в своем движке не использую ни то ни другое :) у меня свое представление - код получился большой правда, но зато все просто и достаточно быстро.
     
  3. Инсайдер
    Оффлайн

    Инсайдер Bruce Wayne

    Репутация:
    0
    Рыбка работает на bitboards
     
  4. WinPooh
    Оффлайн

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

    Репутация:
    95
    Неоднократно слышал такое мнение: в любительских программах главное не оптимизация представления позиции - плюс-минус такт процессора там, плюс-минус обращение к памяти сям - а безглючность генератора ходов. Т.е. практически безразлично, с какой скоростью будет работать генератор - даже если он в два раза неоптимален, это даст проигрыш по глубине меньше чем полуход.

    Что действительно важно - это алгоритмы поиска, сортировка ходов. Уменьшение ветвистости дерева даёт выигрыш несравнимый с копейками, которые можно наскрести на оптимизации генератора ходов...
     
  5. NS
    Оффлайн

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

    Репутация:
    3
    В 2 раза меньше быстродействие, при нормальных алгоритмах - это -70 пунктов силы...
     
  6. WinPooh
    Оффлайн

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

    Репутация:
    95
    Ключевое слово в данной фразе предлагается найти в качестве самостоятельного упражнения :)
     
  7. WinPooh
    Оффлайн

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

    Репутация:
    95
    Не забудем также, что скорость программы не равна скорости генератора ходов, взятого в отдельности. Хьятт, например, приводил данные профилировки Крафти - там было примерно 50 на 50 времени CPU между поиском и оценкой.
     
  8. NS
    Оффлайн

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

    Репутация:
    3
    Я могу проверить на Гаунлетах, но у меня близко к этой цифре. Так что ключевое слово вроде подходит :)
    А +70 - Это достаточно много.
     
  9. WinPooh
    Оффлайн

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

    Репутация:
    95
    Дано: медленный, но отлаженный генератор ходов - против быстрого, но с глюками.
    Оценить возможный разброс рейтингов :)
     
  10. WinPooh
    Оффлайн

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

    Репутация:
    95
    Кстати, можно действительно интересный эксперимент поставить.
    Запрещаем, скажем, генератору генерить ход Nf3-e5 - один-единственный. И смотрим, насколько в длинном матче с правильной версией это скажется.
     
  11. krey
    Оффлайн

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

    Репутация:
    1
    можно запретить не такой, а какой-нибудь уж совсем неожиданный, редкий. и посмотреть, насколько ослабится движок. если не ослабится, отрезать еще один... и т.д. ;) пока все ходы не поотрезаем! на стадии программирования!

    так вот, идея - глупость, но есть рациональное зерно - рассматривть особо странные ходы в последнюю очередь. Ходы типа Кр гэ2 на аш1 без взятия и при отсутствии угрозы королю. правда, можно сконструировать позицию, где именно этот ход будет выигрывать.

    ну как, глупая идея?
     
  12. NS
    Оффлайн

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

    Репутация:
    3
    Если запретить за себя - то не очень сильно, а вот ежели запретить за соперника - то пойдут зевки...
    У меня было хуже - были запрещены взятия, но повезло, что редко встречающиеся. Стоила эта ошибка в районе 30-50 пунктов. (то есть 60-100 пунктов при игре черными)
     
  13. NS
    Оффлайн

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

    Репутация:
    3
    То есть наверно не так :) 10-20 при игре Белыми и 50-80 При игре черными. Но я проверял изменение силы только суммарно, то есть изменение рейтинга по моей базе движка с ошибкой и без.
     
  14. WinPooh
    Оффлайн

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

    Репутация:
    95
    Идея вполне работоспособная. Примерно так и работает эвристика истории - только, вдобавок, "ненужность" ходов определяется динамически, по статистике, уже накопленной в поиске к данному моменту.
     
  15. krey
    Оффлайн

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

    Репутация:
    1
    кстати, а когда вы в движках реализуете обучение? а то неприятно иногда смотреть, когда из 20 партий совпадают вдруг по дебюту партии, и, как следствие, и все остальное.
     
  16. WinPooh
    Оффлайн

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

    Репутация:
    95
    За себя отвечу - два года назад.
     
  17. NS
    Оффлайн

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

    Репутация:
    3
    У меня перед заполнением таблиц для Зобриста делается Randomize() - так что небольшое разнообразие есть :) Для обучения - можно использовать функцию обучения в оболочке.
     
  18. krey
    Оффлайн

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

    Репутация:
    1
    и по теме :) надо заметить, что существуют и другие способы представления позиции - 10*8, 12*12 и еще какие-то... то есть доска расширяется для того чтобы легче было генерировать ходы. типа.
     
  19. NS
    Оффлайн

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

    Репутация:
    3
    Это всё модификации 0x88
     
  20. WinPooh
    Оффлайн

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

    Репутация:
    95
    Самое правильное представление позиции было в Deep Blue - аппаратное :)
     
  21. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    Прошу вернуться в тему! Какие еще есть идеи представления позиции? Кроме битбордов (сорри за описку - я все же совсем чайник в этой области и путаю Архангельск с Астраханью).
     
  22. NS
    Оффлайн

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

    Репутация:
    3
    Лучше начинать с простого. Самое простое и достаточно быстрое это 0x88. На порядок проще писать и оценку, и генератор, и проверку на шах.
     
  23. WinPooh
    Оффлайн

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

    Репутация:
    95
    Согласен, 0x88 - самое простое и лучшее для начала.
    Насчёт битбордов - там тоже есть разные уровни сложности. В GNUChess и GreKo используются битборды в простом варианте - с массивом промежуточных полей для проверки заграждающих фигур. В Crafty - более сложный вариант, rotated bitboards. Они существенно быстрее для генерации ходов, но требуют больше предварительных вычислений.
     
  24. Booot
    Оффлайн

    Booot Учаcтник

    Репутация:
    0
    В своей программе последовательно пееребрал почти все способы представления доски. И 0х88 и битборды простые и битборды вращающиеся. Для понимания проще всего конечно 0х88 - для человека обращаться к массиву интуитивно понятнее чем к отдельному биту. Но битборды "вкуснее" - возможности, которые при их использовании даются "бесплатно" при другом представлении доски еще нужно получить...
     
  25. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    Насколько больше памяти расходуют битборды?
     
  26. NS
    Оффлайн

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

    Репутация:
    3
    Ни на сколько.... Память тратится на ХЕШ таблицы. Так что тратится её одинаково.
    Единственное отличие в трате памяти - Под битБорды иногда (чаще?) используют ХЕШ пешечных структур, но на него нет смысла отводить много памяти (не так много различных расположений пешек случается в переборе)
     
  27. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    Неужели никто не пробовал иные подходы? Мне в голову пришло по крайней мере пяток, как мне кажется, многообещающих вариантов. А все что я вижу это лишь 0x88 или битборды :)

    Важно еще чтобы легко потом было писать ОФ. То есть легко просмотреть взаимодействие фигур, ведь иначе надо оценивать каждую поотдельности. А как анализировать взаимодействие?..
     
  28. NS
    Оффлайн

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

    Репутация:
    3
    Как это не пробовал? Пробовал конечно.
    Но... Небитовые генераторы и т.д. упираются в КОЛИЧЕСТВО ОБРАЩЕНИЙ К ПАМЯТИ, а в 0x88 оно минимизировано :)
     
  29. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    Так ли это? Ведь есть же еще идеи с использованием кэша процессора. Может оказаться, что какие-то представления, учитывающие архитектуру будут лучше... Я лишь гадаю, не судите строго. Я уверен, что у вас, практиков, есть куда более интимные рассуждения, кроме общих о "количестве обращений к памяти". Есть еще пара "теоретических рассуждений полного чайника", вроде меня :)
     
  30. NS
    Оффлайн

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

    Репутация:
    3
    У всех процессоров разная Архитектура. Представление позиции всегда влезает в КЕШ, поэтому достаточно оптимизировать количество обращений к памяти, остальное процессор сделает сам.
    Но Кеш - Это не регистровая переменная. Он всё-равно работает медленней.
     
  31. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    atoku У меня иное предствление :) одномерный массив 0...63
    так что ты не прав - не все держится на битбордах и 0х88 :)
    и все сделано через память (и вроде тормозов не видно) чистая скорость без make\unmake на P4-3000 в начальной позиции ~22 млн.ходов в секунду. но главное конечно в генераторе - это безглючность а не скорость.
     
  32. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    bankuss, спасибо!!! А какая сила твоей программы. Открыты ли исходники? На каком языке написана?

    И почему ты не стал делать 0x88?

    Если бы я когда-либо делал программу, то начал бы, скорее всего, с представления 4 бита на клетку (в С это не проблема). Есть еще одна идея, но, скорее всего, чайнико-безумная :) Но я бы и ее попробовал. Ради интереса :)
     
  33. bankuss
    Оффлайн

    bankuss Александр баннер

    Репутация:
    6
    atoru - сила небольшая... переборщик у меня простой, без наворотов. может на 1800 играет...не знаю, не мерял. написал на VB2005.Net, язык не очень шустрый (как и весь Net), но для экспериментов потянет :) Исходников не открывал, так как Net-exe можно глядеть одной программкой :)