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

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

  1. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Ага, особенно на почти пустой доске с двумя-тремя пешками у каждой стороны :)
  2. NS Нефёдов Сергей

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

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


    Пух, можешь смеятся но на этой позиции генератор даёт почти 7 миллионов ходов в секунду :) А в начальной позиции только 4.5 миллиона. Правда я не реализовал пока ещё рокировку.
  4. WildCat Коршунов Игорь

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

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

    Определимть не оставляем ли мы своим ходом короля под шахом сложнее. Там возникает много технических нюансов. Я пока этот момент не оптимизировал. Просто делаем ход, а потом смотрим попали под шах или нет :) Тут тоже используются функции быстрого определения шаха.
  5. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Это правильно. В позициях, где дальнобойные фигуры не блокированы, скорость должна заметно возрастать.
    Кстати, тебе обязательно нужно сделать список фигур. Без него о скорости лучше совсем уж не париться.
  6. WildCat Коршунов Игорь

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

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Список фигур - это те что на доске остались? И как его с пользой юзать?
  8. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Могу предложить очень много разных определений понятия "проще", на любой вкус :D
  9. WildCat Коршунов Игорь

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

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    А что за странные ответы? Не хочешь не отвечай. Ну посмотри на любую тему на этом форуме. Каждая заканчивается офтопом типа вы все дураки я один умный. Ну может всё таки программеры должны быть не такими казлами как все остальные? Не задумывался над этим?
  11. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Нужно читать выборочно. :) Вот так:
    Что за странные вопросы. Сразу понятно, что быстрее пройтись по списку фигур, чем сканировать всю доску в их поиске.
    Только что при этом происходит с исполнением взятия вражеской пешки?
  12. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    ProstoTak, я тя не понял. Ты спросил - я ответил. Если че не понял - переспроси еще раз.
  13. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    А что с ним происходит?
  14. NS Нефёдов Сергей

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

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Да нет, все нормально. Тормоза - это когда без списков.

    Списки можно такие - PieceList[цвет][тип][номер]. С ними никаких тормозов.
  16. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Тормоза я словил на медленном интерпретаторе :)
    Много строк получается на цикл с условием, да и массивы только одномерные в языке. В итоге на 1С Списки тормозят на исполнителе хода.
  17. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Раз уж зашёл базар про интерпретаторы. На JavaScript генератор ходов никто не делал?
  18. NS Нефёдов Сергей

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

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

    У меня, вроде, никаких сложных циклов с условием нету :)

    Вот функция удаления черной фигуры:
    Код:
    void DeleteBPiece(int type, int sq)
    {
        BXOR(type, sq);
        Plist[type][Pole[sq].num] = Plist[type][Plist[type][0]—];
        Pole[Plist[type][Pole[sq].num]].num = Pole[sq].num;
        Material += PieceValue[type];
        if (type != bpawn) BPieces -= piece_value[type];
        TotalPieces--;
    }
    У меня вообще почти все функции продублированы и за черных и за белых :)
  20. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Ты хранишь на поле порядковый номер фигуры в списке?
    А искать в списке при взятии быстрее не будет?
  21. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Не знаю. Мне так больше нравится.
  22. WinPooh В.М.

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

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

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.491
    Симпатии:
    3.118
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Надо ещё как-то уметь быстро находить удаляемый элемент. Сняли пешку с E2 - как будем искать элемент в середине отдельного массива-списка? Перебирать все подряд?

    У меня примерно так:

    Код:
    struct Sq
    {
       PIECE piece;
       Sq* pnext;
       Sq* pprev;
    };
    
    struct Position
    {
       Sq base[14];
       Sq board[65];
    };
    В массиве base хранятся указатели на начала списков для каждой фигуры.
  25. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Теперь понял :)
  26. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Провёл кое какую оптимизацию. Скорость увеличилась на 4-5%. Это стоящая оптимизация или не стоило и возиться? Вообще какое мнение у программерского народа на этот счёт? Какой прирость в процентах считается существенным?
  27. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    В 2 раза 70 пунктов, в 1.05 раза это 5 пунктов Эло прибавки силы.
    Но ускоряя например на 50% генератор ходов получишь общей прибавки производительности только 10-15%. Так что это пустая трата времени.
  28. ProstoTak Старожил

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

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

    Нужно профайлером померять сколько времени тратится на генератор ходов, а потом уже решать стоит ли думать о его оптимизации.
  30. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Я в своих первобытных движках для теста на скорость оценочную функцию сводил к выдаче просто случайного числа. Таким образом всё затраты времени ложились на генератор и перебор. Но даже при этом результаты были катострофические. Что-то типа 6 полуходв за 3 минуты удавалось прокопать. Наверное дело не только в генераторе, но то что это не пустяк я точно знаю.
  31. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Минимаксом чтоли перебираешь?
  32. ProstoTak Старожил

    • Ветеран
    • Старожил
    Рег.:
    12.02.2006
    Сообщения:
    5.479
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Ну тогда да. Сейчас пока до перебора не дошёл. Хочу всё таки генератор сначала лучший в мире :) забацать.
  33. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    На какой машине? Crafty на Атлоне 2200 мГ нужно около полуминуты (если правильно помню). Так что твой результат не очень плох. А моей проге секунд 15.
  34. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    У тебя генератор/исполнитель в два раза быстрее чем у Крафти?
  35. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Ну это же на 32-битной машине :)

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