Нужен совет по хешу

Тема в разделе "Машинное отделение", создана пользователем дуп, 3 окт 2007.

  1. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Привет братьям-шахматистам!
    У меня вообще то шашки, но здесь, я думаю, это все равно. Я никогда с хеш-таблицами дела не имел, поэтому вопрос может быть глупым. Я сейчас делаю хеш-таблицу для своей проги, играть с ней движок стал сильней, но не очень намного. Я не знаю, как правильно нужно очищать хеш от старых записей и нужно ли это делать вообще. И нигде не могу найти инфы по этому вопросу. Я попробовал два варианта : не очищать вообще и в начале каждой партии. Чего то разницы особой и не заметил. Кому не лень, просветите пожалуйста хотя бы в общих чертах.
     
  2. WildCat
    Оффлайн

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

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

    дуп Учаcтник

    Репутация:
    0
    Стратегия как описана в большинстве примеров : Одно из полей структуры "Hash" - это тип оценки(приоритет). Более глубокие (по depth- у) оценки не затираются более мелкими, а более приоритетные не затираются менее приоритетными.
    А вы не знаете, зачем в KestoG перед каждым поиском обновляется zobrist - массив ?
     
  4. WildCat
    Оффлайн

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

    Репутация:
    0
    В KestoG так было сделано из-за того, что автор не сильно беспокоился об этом. В новой версии все будет подправлено. Когда можно будет увидеть твою программу?

    Если старые заменяются только на более глубокие, то можно сделать счетчик возраста. Перед началом перебора увеличиваем глобальное значение этого счетчика. Замена, при несовпадении значений глобального счетчика и счетчика в ячейке хеша, происходит всегда - глубина при этом не учитывается. А при совпадении счетчиков - как обычно смотрим на глубину.
     
  5. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Со счетчиком попробую, спасибо. Движок можно будет увидеть когда более-менее хорошие результаты будет показывать. Дело движется, только медленней, чем хотелось бы. Со временем беда. Шашкописанием занимаюсь только время от времени. Что представляет из себя прога вы в общих чертах знаете, вы мне пару недель назад компилили ее из-за проблем у меня с компилятором (VS 2005 Express). Она уже заметно сильнее играет с тех пор. Кажется удалось сделать довольно шустрый генератор и надеюсь сделать сильную прогу. Сейчас у меня ближайшая цель - это выигрывать у всех кроме (пока) Kallisto. Какая то нестабильность в игре. Например сегодня запустил матч со Skifi, time 1 min. После первых партий счет был +3 -3 =2.
    Я обрадовался, пошел по делам, прихожу счет +4 -16 =16. В общем как будет что показать, я покажу.
     
  6. WinPooh
    Оффлайн

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

    Репутация:
    95
    Счётчик проще всего сделать по модулю какого-то небольшого числа, для экономии места. У меня это unsigned char (256 циклических значений), в Крафти, кажется, ещё меньше.
     
  7. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Спасибо, WinPooh. Буду разбираться. Дело для меня новое.
    Нигде не встречал в статьях идеи со счетчиком.

    Извиняюсь, Win, до меня только сейчас дошло (см. логин). Что может быть меньше "char" ? В одном байте несколько значений ? Где эту Крафти можно посмотреть ?
     
  8. WildCat
    Оффлайн

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

    Репутация:
    0
    Нестабильность - это из-за малого числа игр. В шашках\шахматах это всегда так. :)

    В Крафти есть переменная где хранятся флаги. Несколько бит это переменной и есть счетчик. На самом деле можно просто применять стратегию постоянной замены старых ячеек - и особо не париться.
     
  9. WinPooh
    Оффлайн

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

    Репутация:
    95
  10. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    WildCat, пользуясь случаем последний вопросик( по GUI ). Такая вещь : моя прога нерационально тратит время, в смысле к концу игры, когда все уже ясно, остается вагон неиспользованного времени. Я по-быстрому слепил такую штуку : через каждые несколько ходов набегает разница в несколько секунд между моим временем и вражеским ( как правило в мою пользу). Я просто эту разницу прибавляю себе на поиск очередного хода. Все хорошо, только если не играть в режиме "игра с юзером". Юзеру ведь не надо следить за временем, он может над вторым-третьим ходом продумать все время и сходить за секунду до конца. И я со своей "разницей" оказываюсь в прошлом (или в будущем?). Это как, недопустимый дефект для движка? Придумать что-нибудь поумнее?
     
  11. WildCat
    Оффлайн

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

    Репутация:
    0
    Ориентироваться таким образом на время соперника не кажется хорошей идеей. Будет лучше просто все оставшееся время разделить на 20 и использовать это время на ход. Плюс некий бонус на то, чтобы закончить текущий уровень.
     
  12. NS
    Оффлайн

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

    Репутация:
    3
    Не с тем Скифи проверял. :) Если с версиями 0.03-0.04, то могу выслать версию играющую более чем на 200 пунктов Эло сильнее.
     
  13. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Привет и Respect Скифи_мэйкеру !
    Да, вышлите пожалуйста, у меня сейчас 0.03.
    Никакая Эло меня не беспокоит, потому как я не знаю что это такое:)
    У меня своя Эло. Я прямо сейчас ее и проверю и результат сообщу.
     
  14. NS
    Оффлайн

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

    Репутация:
    3
    Куда высылать-то? :) Скинь мыло в личку.
     
  15. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    [email protected]
    Я когда регился на сайте писал свой адрес, не знаю почему его нет.
     
  16. NS
    Оффлайн

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

    Репутация:
    3
    Он есть, только он скрыт - я могу послать тебе сообщение по e-mail, но не увижу твой адрес.
     
  17. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Получил.
    Поиграл.
    Мне полный пинцет: +0 -15 =6.
    Но вы не расслабляйтесь, на всякий случай.
     
  18. NS
    Оффлайн

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

    Репутация:
    3
    Я напрягся и начал бояться :)
     
  19. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Извиняюсь за оффтопик, не мог бы мне кто-нибудь объяснить еще : что такое "таблица перестановок", чем она отличается от хеш-таблицы ?
     
  20. NS
    Оффлайн

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

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

    Когда храним позиции встретившиеся в переборе - это уже Хеш перекрестных позиций. Другое её название - таблица перестановок.
     
  21. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Спасибо. Тогда выходит, что у меня и не хеш-таблица вовсе, а таблица перестановок. Она только и делает у меня, что хранит позиции, встретившиеся в игре. У меня нет отдельных ходов, у меня генератор генерит сразу готовые позиции. Нет функций Make/UnmakeMove.
    Правильно я понял? Если правильно, то можно и не отвечать, не хочу отвлекать от дел.
     
  22. NS
    Оффлайн

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

    Репутация:
    3
    Не отвлекаешь :)
    Да, то что ты спрашиваешь это хеш перекрестных позиций (Таблица перестановок)
    Генерируешь готовые позиции? Тогда скорость наверно совсем маленькая...
     
  23. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Там где у Skifi 0.07( в GUI Kallisto строка speed) 700 - 800, у меня 2100 - 2200. До хеша было 4000 - 4500. А вконце игры (когда шашек мало) доходило иногда до 5500.
     
  24. NS
    Оффлайн

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

    Репутация:
    3
    То есть скорость - 2 100 000 позиций в секунду?
    Но если ты сразу генеришь готовые позиции - то как ты хранишь в хеше лучшие ходы?
    Как ты сортируешь ходы?
     
  25. NS
    Оффлайн

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

    Репутация:
    3
  26. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Ходы пока никак не сортирую.
    В хеше ходы не храню. Я пробовал хранить (и сам ход пробовал, и номер хода после генерилова). Толку никакого. В хеше храню только оценку позиции ( ну или хода, не знаю как правильней у меня это одно и тоже).
    Насчет хеша вы не забывайте, что я еще толком с ним не разобрался, он у меня всего 3 дня.
    У меня ход (она же позиция) - это структура из четырех 64 битных чисел :
    белые шашки, черные, дамки обоих цветов и прибавился недавно еще хеш-ключ.
    В генератор передается текущая позиция и относительно нее генерятся ходы.
    Я все боялся, что может приключиться какая-нибудь нехватка памяти или
    что-нибудь в этом духе. Специально запускал движки с контролем времени 2 часа( интересно, будет еще кто нибудь с таким временем в шашки играть!)
    И ничего не происходит, подумав по пять минут над первым ходом проги спокойно играют.
    Все наверно непонятно объяснил, если что нибудь интересует, спрашивайте.
     
  27. NS
    Оффлайн

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

    Репутация:
    3
    Да нет, всё понятно. Интересно, без сортировки ходов какая глубина перебора получается? Наверно за минуту не больше десяти полуходов?
     
  28. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Без хеша было 11 - 13 ( 1 мин на партию), сейчас 12 - 18 (редко больше 15).
    Сортировки нет (пока, прога же только пишется), есть итеративные углубления (примерно как в Сидре). После каждого круга лучший найденный ход "подкачивается" на первое место.
    Спасибо кстати за ссылку. Я там только ткнул наугад, там какой то plus 600 говорит о своей проге : "У меня самая лучшая оценочная функция".
    Совсем как у какого то сатирика, кажется Жванецкого : "Это только он говорит или еще кто - нибудь ?" Веселые там видать парни, надо будет полазать.
     
  29. NS
    Оффлайн

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

    Репутация:
    3
    Не думаю что у Плюса лучшая оценочная функция :/
    Я такого его поста не видел.
     
  30. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    Черт, не получается вставить ссылку.
    По вашей ссылке -> Программа Plus 600 -> Аргументы против Plus 600 ->
    1 страница, сообщение № 1406.
    Сейчас, правда, пригляделся давно дело было, но я не врал.
     
  31. WildCat
    Оффлайн

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

    Репутация:
    0
    Да Плюс600 постоянно что-то такое о своей программе говорит. Самое смешное, что все это на полном серьезе. :)

    А насчет таблицы перестановок и хеш-таблицы, я бы сказал, что хеш-таблица - это просто способ реализации таблицы перестановок.
     
  32. дуп
    Оффлайн

    дуп Учаcтник

    Репутация:
    0
    WildCat, WinPooh, NS. Спасибо всем, кто помогал.
    Помогли реально. Я уже упаковал два поля в одно unsigned char( в хеше). Глубину и тип оценки. Сделал сам, Крафти я качнул, глянул, мне чуть плохо не стало. Легче изобрести свой лисапед, чем во всем этом разбираться. А еще где то я видел на этом форуме, что кто то мол дизассемблировал какую то серьезную шахматную программу, не помню про какую там разговор шел. Да в жизни не поверю. Тут готовые исходники на С и то с ума сойдешь, пока въедешь.:lol:
     
  33. WildCat
    Оффлайн

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

    Репутация:
    0
    Не стоит стараться въехать в Крафти, т.к. она написана очень криво.
     
  34. WinPooh
    Оффлайн

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

    Репутация:
    95
    В Крафти самое ценное - это комментарии. Основной объём их сосредоточен в файле main.c - со всей историей хьяттовских проб и ошибок. Кое-что я почерпнул, читая комментарии из функции оценки. В остальное лазить и не пытался :)
     
  35. WildCat
    Оффлайн

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

    Репутация:
    0
    Да, комментарии почитать можно. Я сказал, что не стоит разбираться в Крафти, т.к. это может пагубно отразиться на стиле начинающего программиста. :cool: