Генератор ходов

Тема в разделе "Машинное отделение", создана пользователем Binary, 27 авг 2006.

  1. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    Вот решил написать шахматный движок , но мой генератор получился ОЧЕНЬ тормозным
    [1500 kN/s] , так что он отправился в Recycler Bin ...
    Как я делал : __int8 board [144] - доска
    board movegen (board old, nm &nextmove) - генерирует board с одной перемещенной фигурой
    struct nm
    {
    __int8 num;// номер фигуры которая должна ходить
    __int8 dir;// направление
    __int8 step;// для дальнобойных
    bool use;//movegen рекурсивная и может в конце концов вернуть 0, т.е. board old;
    }
    Главная проблема думаю , что нет UNMAKE - MAKE_MOVE
    Я не любитель изучать исходники Crafty и Fruit , но как я понимаю там
    AddCaptures () генерирует все ходы в нек позиции и заносит в нек массив , а MAKE_MOVE и UNMAKE -
    исполняют их .... Но я так и не понял в каком виде AddCaptures сохраняет ходы ...
    Кстати какой должна быть чистая скорость генератора , что-то около 2000 - 2500 kN/s на моём Athlon 3000 ?
     
  2. NS
    Оффлайн

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

    Репутация:
    3
    А как тестировал скорость генератора?
     
  3. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    объявил глобальную переменную int PositionsTotal и вместо оценочной ф-ции которой нет написал
    PositionsTotal++; :))
    в начале и в конце вызвал GetLocalTime
     
  4. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Значит кроме генераторе еще очень много кода выполнялось. Так что реальная скорость генератора больше.

    Простейшая структура для хранения ходов:
    struct Move
    {
    int from; // откуда ходим
    int to; // куда ходим
    };
     
  5. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    правильно что AddCaptures () генерирует сразу все ходы , или только один ход за вызов ?
     
  6. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Обычно генерируют сразу все взятия.
    AddCaptures - это откуда?
     
  7. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    Fruit :
    static void add_captures(list_t * list, const board_t * board)
    кусок ф-ции :
    ...
    case Knight64:

    to = from - 33;
    if (FLAG_IS(board->square[to],opp_flag)) LIST_ADD(list,MOVE_MAKE(from,to));

    to = from - 31;
    if (FLAG_IS(board->square[to],opp_flag)) LIST_ADD(list,MOVE_MAKE(from,to));

    to = from - 18;
    if (FLAG_IS(board->square[to],opp_flag)) LIST_ADD(list,MOVE_MAKE(from,to));
    ...
    Получается ,что если мне нужно просчитать на несколько полуходов, я должен сохранить всю историю ходов...
    т.е. я в начале должен объявит некую " Move AllMoves[max_depth] ", в кэш такая бандура влезет ?
    ведь max_depth может быть и 100...
     
  8. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Почему тебя кэш волнует? Ты сначала программу напиши, а потом уже про кэш думать можно.
     
  9. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    неохото потом код заново переколбашивать ... :)
     
  10. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    может кто-нибудь знает где взять такие исходники , чтоб я сразу въехал ...
    во Fruit -овых макрос на макросе ... в crafty много объяснений но сами функции от этого только хуже воспринимаются :)
     
  11. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    TSCP - самый простой движок с открытыми исходниками.
    Тут еще бывает автор GreKo. Можешь взять его исходники, а что непонятно спросить.
     
  12. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    сейчас попросим гугля помочь :)
     
  13. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    итак готово ...
    TSCP 181 ... смотрю архив .... отлично файлов не много ... ногу не сломаешь :)
    приступим к изучению
     
  14. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    readme меня порадовал :

    TSCP is intended for people who want to learn about chess programming. Its
    source code is designed to be very easy to understand.
    :)
     
  15. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    кстати исходники действительно хорошие ... всё понятно ... таких бы побольше
     
  16. NS
    Оффлайн

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

    Репутация:
    3
    Намного полезней написать самостоятельно, чем копировать чужие исходники. :)
     
  17. Binary
    Оффлайн

    Binary Учаcтник

    Репутация:
    0
    я тоже так думаю ...
    хочу лишь почерпнуть хорошие идеи ... одна голова хорошо, а две лучше
     
  18. bankuss
    Оффлайн

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

    Репутация:
    6
    можно и свое написать, но рано или поздно придешь к тому, что уже кем то написано :) ибо хороших идей мало и они имеют свойство повторятся, даже если приходят в голову совсем разным людям.
     
  19. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Стоит к психологу сходить :)
     
  20. NS
    Оффлайн

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

    Репутация:
    3
    В шашках написал первый генератор - получился очень похожий на генератор из открытых исходников Коршунова... Второй генератор скорей всего не похож ни на что существующее, весьма заморочный но очень быстрый. Вот и что-то новое! Осталось только довести его до ума - раз уж иду на рекорд, значит нужно поставить рекорд! :)
     
  21. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    NS, а время-то идет :) А Рыбку или хотя бы Крафти надо бить уже скоро!
     
  22. NS
    Оффлайн

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

    Репутация:
    3
    Надо немного отвлечься от шахмат ;)
     
  23. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    ОФФТОП: Вы лучше скажите, как в Т-744 вы сумели проиграть Kit? Жалко! :/
     
  24. WinPooh
    Онлайн

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

    Репутация:
    95
    А о каких шашках речь, о русских или международных? Задача написания генератора существенно усложняется, если надо учитывать правило взятия большинства...
     
  25. NS
    Оффлайн

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

    Репутация:
    3
    В русских, но метод быстрой генерации простых ходов с одновременной проверкой на взятия (позиции в которых нет взятий встречаются в 4-5 раз чаще, чем те, в которых взятия есть) применим и в международных... Правило большинства особо не усложняет генератор (просто из рекурсивной процедуры возвращаем "максимальное взятие") То есть фактически усложнения нет.
     
  26. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Правило максимального взятия реализуется легко. Если новое взятие снимает больше шашек, чем найденные до сих пор, то просто записываем его в начало списка и количество взятий = 1.
    Если равно, то добавляем к списку.
    Если меньше, то игнорируем это взятие.
     
  27. NS
    Оффлайн

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

    Репутация:
    3
    ???? При обчном способе записи взятий, если не записывать взятия "меньшие" уже найденного - и так все взятия окажутся отсортированными... Только в обратном порядке :) (каждое следующее записанное не меньше предыдущего.)
     
  28. NS
    Оффлайн

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

    Репутация:
    3
    Работает моя идея и в шахматах, только получается четырехпроходный генератор. (в шашках выгода явная, так как двухпроходный, и сразу определяется возможность взятий, в шахматах не совсем понятно насколько выгоден)
    Его плюсы - сразу проверяется легальность (определяются связанные фигуры и битые поля)
    И сразу проверяется является ли ход шахом.
     
  29. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    Совсем непонятная фраза. Как они окажутся отсортированными, если мы их вовсе не записывали?
     
  30. bankuss
    Оффлайн

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

    Репутация:
    6
    atoku да так.. времени мало было на анализ :) вот и результат
     
  31. NS
    Оффлайн

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

    Репутация:
    3
    Код:
    КолВзятий=0;
    колЛегальныхВзятий=0;
    МаксВзятие=0;
    Процедура ДобавлениеВзятия(Взятие)
      колЛегальныхВзятий=колЛегальныхВзятий+1;
      колВзятий=колВзятий+1;
      СписокВзятий[колВзятий]=Взятие;
    КонецПроцедуры;
    Процедура ДобавлениеЛегальногоВзятия(количествоСъеденныхШашек, Взятие)
      Если КоличествоСъеденныхШашек<МаксВзятие Тогда
        Возврат;
      Иначе
          Если количествоСъеденныхШашек>МаксВзятие Тогда
              МаксВзятие=КоличествоСъеденныхШашек;
              колЛегальныхВзятий=0;
          КонецЕсли;
         ДобавлениеВзятия(Взятие);
      КонецЕсли;
    КонецПроцедуры;
    Всего легальных взятий - колЛегальныхВзятий...
    Извлечение I-го легального взятия СписокВзятий[колВзятий+1-I]

    Если мы сначала записали взятие одной шашки, а потом двух - то они оба будут записаны, если после этого появится взятие одной шашки - то оно уже не будет записано, так как уже нашли взятие двух шашек. Взятия всё-время пишутся в конец массива.
     
  32. WildCat
    Оффлайн

    WildCat Коршунов Игорь Команда форума

    Репутация:
    0
    А зачем так сложно?
    Достаточно иметь колЛегальныхВзятий. Зачем нам нелегальные взятия?
     
  33. NS
    Оффлайн

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

    Репутация:
    3
    Да, понял - в случае большего количества взятий просто сбрасываем счетчик ходов.
     
  34. atoku
    Оффлайн

    atoku Модератор

    Репутация:
    0
    Все равно у вас крутой рекорд. А то что получается удаленная проходная в той партии было непросто углядеть по ходу жизни. Я же удивился как вы уравняли легко в нашей партии. Ну ничего, поборемся еще :)
     
  35. bankuss
    Оффлайн

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

    Репутация:
    6
    atoku ну можно сказать что у нас динамическое равновесие :) но у тебя чуть лучше за счет развития, все зависит от твоей активности :)