Хеширование и счетчик 50 ходов

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

  1. TopicStarter Overlay

    WildCat Коршунов Игорь

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

    Все это я к тому рассказал, что программа не видела ничьи до самого конца, т.к. из-за того, что позиция была заблокирована, почти всегда перебор доходил до позиции из хеш-таблицы и возвращал оценку с перевесом. Т.е. перебор не доходил до того момента, когда счетчик насчитает 50 тихих ходов, чтобы вернуть нулевую оценку.

    Возможно, если бы увидела, что это ничья по правилу 50 ходов, то попыталась бы двинуть пешку (и может быть проиргала бы как это бывает и с более сильными движками :cool:).
    Стоит ли эта проблема, чтобы думать о ее решении? :rolleyes:
    Или может есть какое простое решение этой проблемы?
  2. NS Нефёдов Сергей

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

    Решение конечно-же простое... Кроме оценки возращается достоверный интервал оценки - каким бы он был если бы правило 50 ходов не сработало-бы.
  3. NS Нефёдов Сергей

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

    WildCat Коршунов Игорь

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

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

    // ходов по правилу 50 сделано на текущий момент + значение из Хеша
    if (current50Moves+hash50moves)>=100 then
    Begin

    // если оценка в хеше меньше нуля, и тип оценки "<=" либо "="
    if (Score<0)and(ScoreT<=0) then
    Begin // поменяем извлеченную из хеша оценку на "<= 0"
    Score:=0;
    ScoreT:=-1;
    End;

    // если оценка в хеше больше нуля, и тип оценки ">=" либо "="
    if (Score>0)and(ScoreT>=0) then
    Begin // поменяем извлеченную из хеша оценку на ">= 0"
    Score:=0;
    ScoreT:=1;
    End;

    После этого часть захешированных оценок перестанет использоваться. (влияющих на правило 50 ходов)
  6. NS Нефёдов Сергей

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

    Function Search(a,b:integer;Var rule50Move:integer):integer;
    Var rule50;
    Begin
    rule50Move:=0;
    kolMoves:=GenMoves();
    For i:=1 to kolMoves do
    MakeMove;
    Score:=-Search(-B,-A,Rule50);
    UnMakeMove;
    if (ход не взятие и не ход пешкой) and ((score>A) or (score<0)) then
    if Rule50>=rule50Move then rule50Move:=rule50+1;
    if (score>=B) and (score>0) then
    if (ход не взятие и не ход пешкой) then rule50move:=Rule50+1
    else rule50Move:=0;


    дописал условия по Score
  7. TopicStarter Overlay

    WildCat Коршунов Игорь

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

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

    Я образно написал - можно добавить условий связанных со сравнением Score с нулем, чтоб глубина в хеш поменьше писалась.
  9. MS Михаил Семионенков

    • Команда форума
    Рег.:
    11.02.2006
    Сообщения:
    6.542
    Симпатии:
    3.361
    Репутация:
    175
    Оффлайн
    По дилетанству могу чего недопонять, но мне кажется, что уважаемый WildCat просто напрашивается на комплимент :), вполне заслуженный: программа не ослабилась и не проиграла.
    Дело, если я правильно понял, не в правиле 50 ходов, а в непонимании ничейности закрытой позиции. Но не буду в сотый раз о крепостях :)
  10. TopicStarter Overlay

    WildCat Коршунов Игорь

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

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

    Пусть оценка в хеше опровергающая (">=" либо "<=") тогда берем срез дерева перебора так что за опровергающую сторону берутся только опровергающие ходы, а за опровергаемую все ходы. Если оценка "=" тогда берем всё поддерево.
    Смотрим в этом поддереве ветвь из тихих ходов наибольшей длины и пишем её в хеш вместе с оценкой.

    Это достигается вот такм кодом:

    if (ход не взятие и не ход пешкой) then
    if Rule50>=rule50Move then rule50Move:=rule50+1;
    // если длина тихого варианта больше уже достигнутой, тогда увеличиваем её.


    if (score>=B) then
    if (ход не взятие и не ход пешкой) then rule50move:=Rule50+1
    else rule50Move:=0;

    // если узел опровергающий, то берем срез дерева только с опровергающим ходом, если при этом текущий ход не тихий, то сбрасываем счетчик тихих ходов.


    Когда извлекаем оценку из хеша. Если у нас оценка опровергающая по альфе, и пр этом оценка больше нуля, то правило 50 ходов её испортить не может.
    Если оценка опровергающая по альфе и меньше нуля, то её может испортить правило 50 ходов.
    То есть в Хеше <=-8, но текущая длина тихого варианта + длина тихого варианта из Хеша превышает 99 полуходов. Возможно слабейшая сторона может добиться нулевой оценки. Меняем при извлечении из хеша оценку на <=0
  12. TopicStarter Overlay

    WildCat Коршунов Игорь

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

    WildCat Коршунов Игорь

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

    if (ply + hash_entry->depth >= 100)
    {
    if (hash_entry->type == HASH_EXACT) return HASH_MISS;
    if (hash_entry->type == HASH_LOW && hash_entry->score > 0) return 0; // >=
    if (hash_entry->type == HASH_HIGH && hash_entry->score < 0) return 0; // <=
    }

    Т.е. вблизи правила 50-ти не используем опасные оценки из хеша, т.к. они скорее всего неадекватны
  14. NS Нефёдов Сергей

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

    Число "тихих по правилу 50" ходов легко может быть больше чем Depth, если есть продления на шахах, на единственном ходе, либо просматриваются шахи в ФВ.
  15. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    if (hash_entry->type == HASH_EXACT) return HASH_MISS;
    В этом случае мы можем тоже использовать оценку из хеша.
    Если она больше нуля, то Можно вернуть ноль, и поменять при этом тип оценки на HASH_LOW, если она больше нуля, то поменять тип оценки на HASH_HIGH, если она равна нулю, то ей можно использовать - правило 50 ходов её не исказит.

    Безопасное использование оценок из хеша, при этом большинство узлов будет считать безопасными даже вблизи правила 50, при этом вычислять безопасные узлы будет без ошибок.

    Мы складываем количество полуходов которые мы уже сделали по правилу 50, и количество полуходов по правилу 50 которые еще придется сделать чтоб не исказилась оценка из Хеша.

    Если неиспользовать все потенциально опасные без расчета опасной глубины то полностью отключится хеширование, и соответственно резко упадет глубина перебора.
  16. TopicStarter Overlay

    WildCat Коршунов Игорь

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

    WildCat Коршунов Игорь

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

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

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Хеш таких позиций, где есть ходы пешками или взятия на не поможет, т.к. там везде будет <= GlobalScore.
    Да и вообще решение этой проблемы никак на силу игры не повлияет. В скольких партиях правило 50 ходов оказывается критичным? И много их них мы выиграем, если нормально выиграть не можем?
  20. NS Нефёдов Сергей

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

    Реально партии с ошибками на правиле 50 ходов встречаются достаточно часто - больше 1% партий. Причем лажаются очень многие движки.

    В корне дерева, на первом ходе - примерно половина всех узлов.
    На всех ответах соперника на первый (PV) ход кроме сильнейшего оценка будет ">= GlobalScore", рассмотреть все ответы на первый ход в корне мы обязаны по правилам альфа-беты.
  21. TopicStarter Overlay

    WildCat Коршунов Игорь

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

    Так это нас уж совсем не интересует. Нам даже <= плохо помогает, >= вообще никак.
  22. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Не совсем понял логику. На форуме неудобно рисовать дерево перебора, но в ответ на первый ход при максимальных отсечения по альфа-бете везде будет ">=GlobalScore" (<=-GlobalScore)
    99% узлов. и 1% PV узлов.
    Как они не помогают - одинаковые позиции встречаются, хеш перекрестных работает, все отcечения по ним и происходят. Если хеш перекрестных сокращает дерево в 4 раза, то по этим оценкам на первом ходе в корне мы в четыре раза дерево как раз и сократим.

    А при уменьшении GlobalScore (при достижении правила 50 она приблизится к нулю) - количество отсечек по оценке ">=" не уменьшится... Но не уменьшится в том случае, если мы безопасно будем продолжать их использовать.
  23. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Так нам оценка нужна около нуля, а не >= GlobalScore. Что мы отсечем по такой оценке?
  24. NS Нефёдов Сергей

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

    WildCat Коршунов Игорь

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

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Как помогут оценки >=GlobalScore, где GLobalScore>=0? :)
    Так-же как и раньше.
  27. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    GlobalScore заметно больше нуля (иначе вообще не очем рассуждать). Хеш с оценками >= GlobalScore будет давать мало отсечений.
  28. TopicStarter Overlay

    WildCat Коршунов Игорь

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

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

    Сильнейшая сторона должна опровергнуть все ответы соперника. За сильнейшую сторону нужно найти только один опровергающий ход на каждый ход соперника.

    То есть опровергать слабые ходы слабейшей стороны нужно всегда, и рассматривать нужно их все. Опровергать слабые ходы сильнейшей стороны нужно только если сильнейшая сторона совершила ошибку. Если сортировки верные - то первый же ход сильнейшей стороны сделает отсечку по Бете.


    У нас сортировки близки к идеальным. Любой не PV узел отcекается оценкой >=GlobalScore
  30. NS Нефёдов Сергей

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

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Заканчивай уже издеваться.
    1.e4 e5 2. Qh5 Nf6 - зачем здесь рассматривать ВСЕ ходы слабейшей стороны? Одного вполне достаточно.
  32. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Я же написал на первый (PV) ход сильнейшей стороны мы обязаны рассмотреть все ответы соперника.
    То есть дерево -
    3. Qe5, допустим 3...Be7 сильнейший.
    Но мы должны за слабейшую сторону рассмотреть не только ход Be7, но и все остальные ходы. И во всех поддеревьях в ответ на ходы кроме Be7 мы должны найти только один опровергающий ход сильнейшей стороны, и рассмотреть все ходы слабейшей стороны.
    И любой узел этих поддеревьев отсекается как раз оценкой >=GlobalScore
  33. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Тут единственно важный момент сколько узлов неиспорченных приближением правила 50 в хеше останется. Такие позиции остануться ТОЛЬКО на тех ветках, где сильнейшая сторона делала плохие продвижения пешек или плохие размены. И почти везде в таких позициях <= GlobalScore. Какие тут могут быть отсечения? Очень редкие.
  34. TopicStarter Overlay

    WildCat Коршунов Игорь

    • Команда форума
    Рег.:
    04.05.2006
    Сообщения:
    3.599
    Симпатии:
    4
    Репутация:
    0
    Адрес:
    Гомель
    Оффлайн
    Какой-то тупой пример я привел.
    1. f4 e5 2. g4 QhХ - так понятно, что ни к чему рассматривать все продолжения слабейшей стороны?
  35. TopicStarter Overlay

    WildCat Коршунов Игорь

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

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