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

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

  1. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    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 Нефёдов Сергей

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

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    объявил глобальную переменную int PositionsTotal и вместо оценочной ф-ции которой нет написал
    PositionsTotal++; :))
    в начале и в конце вызвал GetLocalTime
  4. WildCat Коршунов Игорь

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

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

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    правильно что AddCaptures () генерирует сразу все ходы , или только один ход за вызов ?
  6. WildCat Коршунов Игорь

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

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    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 Коршунов Игорь

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

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    неохото потом код заново переколбашивать ... :)
  10. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    может кто-нибудь знает где взять такие исходники , чтоб я сразу въехал ...
    во Fruit -овых макрос на макросе ... в crafty много объяснений но сами функции от этого только хуже воспринимаются :)
  11. WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    TSCP - самый простой движок с открытыми исходниками.
    Тут еще бывает автор GreKo. Можешь взять его исходники, а что непонятно спросить.
  12. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    сейчас попросим гугля помочь :)
  13. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    итак готово ...
    TSCP 181 ... смотрю архив .... отлично файлов не много ... ногу не сломаешь :)
    приступим к изучению
  14. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    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. TopicStarter Overlay

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    кстати исходники действительно хорошие ... всё понятно ... таких бы побольше
  16. NS Нефёдов Сергей

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

    Binary Учаcтник

    • Участник
    Рег.:
    27.08.2006
    Сообщения:
    135
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Мытищи
    Оффлайн
    я тоже так думаю ...
    хочу лишь почерпнуть хорошие идеи ... одна голова хорошо, а две лучше
  18. bankuss Александр

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

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

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

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

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

    • Команда форума
    Рег.:
    05.02.2006
    Сообщения:
    2.949
    Симпатии:
    9
    Репутация:
    0
    Адрес:
    USA
    Оффлайн
    ОФФТОП: Вы лучше скажите, как в Т-744 вы сумели проиграть Kit? Жалко! :/
  24. WinPooh В.М.

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

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

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Правило максимального взятия реализуется легко. Если новое взятие снимает больше шашек, чем найденные до сих пор, то просто записываем его в начало списка и количество взятий = 1.
    Если равно, то добавляем к списку.
    Если меньше, то игнорируем это взятие.
  27. NS Нефёдов Сергей

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

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

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

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    atoku да так.. времени мало было на анализ :) вот и результат
  31. NS Нефёдов Сергей

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

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

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

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

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

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    atoku ну можно сказать что у нас динамическое равновесие :) но у тебя чуть лучше за счет развития, все зависит от твоей активности :)

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