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

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

  1. TopicStarter Overlay

    atoku Модератор

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

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

    Хочется почитать мнения!
  2. bankuss Александр

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

    • Участник
    • Старожил
    Рег.:
    11.02.2006
    Сообщения:
    700
    Симпатии:
    3
    Репутация:
    0
    Адрес:
    Gotham City
    Оффлайн
    Рыбка работает на bitboards
  4. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.120
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Неоднократно слышал такое мнение: в любительских программах главное не оптимизация представления позиции - плюс-минус такт процессора там, плюс-минус обращение к памяти сям - а безглючность генератора ходов. Т.е. практически безразлично, с какой скоростью будет работать генератор - даже если он в два раза неоптимален, это даст проигрыш по глубине меньше чем полуход.

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

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    В 2 раза меньше быстродействие, при нормальных алгоритмах - это -70 пунктов силы...
  6. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.120
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Ключевое слово в данной фразе предлагается найти в качестве самостоятельного упражнения :)
  7. WinPooh В.М.

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

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Я могу проверить на Гаунлетах, но у меня близко к этой цифре. Так что ключевое слово вроде подходит :)
    А +70 - Это достаточно много.
  9. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.120
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Дано: медленный, но отлаженный генератор ходов - против быстрого, но с глюками.
    Оценить возможный разброс рейтингов :)
  10. WinPooh В.М.

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

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.709
    Симпатии:
    50
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    можно запретить не такой, а какой-нибудь уж совсем неожиданный, редкий. и посмотреть, насколько ослабится движок. если не ослабится, отрезать еще один... и т.д. ;) пока все ходы не поотрезаем! на стадии программирования!

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

    ну как, глупая идея?
  12. NS Нефёдов Сергей

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

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

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.120
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Идея вполне работоспособная. Примерно так и работает эвристика истории - только, вдобавок, "ненужность" ходов определяется динамически, по статистике, уже накопленной в поиске к данному моменту.
  15. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.709
    Симпатии:
    50
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    кстати, а когда вы в движках реализуете обучение? а то неприятно иногда смотреть, когда из 20 партий совпадают вдруг по дебюту партии, и, как следствие, и все остальное.
  16. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.120
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    За себя отвечу - два года назад.
  17. NS Нефёдов Сергей

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

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

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Это всё модификации 0x88
  20. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.120
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Самое правильное представление позиции было в Deep Blue - аппаратное :)
  21. TopicStarter Overlay

    atoku Модератор

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

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Лучше начинать с простого. Самое простое и достаточно быстрое это 0x88. На порядок проще писать и оценку, и генератор, и проверку на шах.
  23. WinPooh В.М.

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

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

    atoku Модератор

    • Команда форума
    Рег.:
    05.02.2006
    Сообщения:
    2.949
    Симпатии:
    9
    Репутация:
    0
    Адрес:
    USA
    Оффлайн
    Насколько больше памяти расходуют битборды?
  26. NS Нефёдов Сергей

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

    atoku Модератор

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

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

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

    atoku Модератор

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

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

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

    atoku Модератор

    • Команда форума
    Рег.:
    05.02.2006
    Сообщения:
    2.949
    Симпатии:
    9
    Репутация:
    0
    Адрес:
    USA
    Оффлайн
    bankuss, спасибо!!! А какая сила твоей программы. Открыты ли исходники? На каком языке написана?

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

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

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

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