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

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

  1. TopicStarter Overlay

    дуп Учаcтник

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

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

    дуп Учаcтник

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

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

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

    дуп Учаcтник

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

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

    дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    Спасибо, WinPooh. Буду разбираться. Дело для меня новое.
    Нигде не встречал в статьях идеи со счетчиком.

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

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

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

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.122
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
  10. TopicStarter Overlay

    дуп Учаcтник

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

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

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

    дуп Учаcтник

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

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

    дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    [email protected]
    Я когда регился на сайте писал свой адрес, не знаю почему его нет.
  16. NS Нефёдов Сергей

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

    дуп Учаcтник

    • Участник
    Рег.:
    11.09.2007
    Сообщения:
    113
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Великий Новгород
    Оффлайн
    Получил.
    Поиграл.
    Мне полный пинцет: +0 -15 =6.
    Но вы не расслабляйтесь, на всякий случай.
  18. NS Нефёдов Сергей

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

    дуп Учаcтник

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

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

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

    дуп Учаcтник

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

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

    дуп Учаcтник

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

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

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

    дуп Учаcтник

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

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

    дуп Учаcтник

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

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

    дуп Учаcтник

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

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

    А насчет таблицы перестановок и хеш-таблицы, я бы сказал, что хеш-таблица - это просто способ реализации таблицы перестановок.
  32. TopicStarter Overlay

    дуп Учаcтник

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

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

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

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

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