Navigation » Immortal Chess - Chess without Frontiers! > Шахматный раздел > Шахматное программирование » Вопросы к шахматным программистам

Важная информация

Шахматное программирование Chess Programming. Вы уже написали свою шахматную программу? Или только-только приступили к её разработке? Добро пожаловать в данный раздел! Делимся советами, помогаем новичкам в шахматном программировании

Ответ
Опции темы
Непрочитано 31.12.2016, 02:34   #1621
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Вот например партия Каспарова и Deep Blue. Ход белых, у них материальный перевес - они ставят ферзя, но чёрные сводят к ничьей троекратным повторением шаха ладьёй.
Спасибо. Хороший пример. Поставил белого ферзя. Черные нашли спасение.

Вот еще нашел интересные примеры.

Заодно сделал проверку правила 50 ходов. Теперь надо придумать тестовый пример, чтоб во спасение срабатывало правило 50 ходов, а не 3 повторений.
enko8086 вне форума   Ответить с цитированием
Непрочитано 31.12.2016, 03:32   #1622
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Еще такой вопрос. Может ли быть такая позиция, в которой генератор ходов, который никак не учитывает угрозы королю, не генерирует ни одного хода? Мне кажется, нет. Но не уверен на 100%.

Придумал:
[SetUp "1"] [FEN "5rBB/5PRK/6PP/4k3/8/8/8/8 w - - 42 51 "]
FEN: 5rBB/5PRK/6PP/4k3/8/8/8/8 w - - 42 51

Интересно, есть ли более правдоподобный пример.

Последний раз редактировалось enko8086; 31.12.2016 в 03:44.
enko8086 вне форума   Ответить с цитированием
Непрочитано 31.12.2016, 05:24   #1623
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Не понятно, как заставить движок приближать выбор хода, на котором требовать ничью по правилу 50 ходов. Кстати, а в UCI вообще есть команда, которая требует ничью по правилу 50 ходов?

Последний раз редактировалось enko8086; 31.12.2016 в 05:26.
enko8086 вне форума   Ответить с цитированием
Непрочитано 31.12.2016, 13:49   #1624
Neurocore
 
Аватар для Neurocore
 
Регистрация: 18.03.2010
Адрес: г.Барнаул
Возраст: 28
Сообщений: 452
Сказал(а) спасибо: 2,587
Поблагодарили 770 раз(а) в 339 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Спасибо. Хороший пример. Поставил белого ферзя. Черные нашли спасение.

Вот еще нашел интересные примеры.

Заодно сделал проверку правила 50 ходов. Теперь надо придумать тестовый пример, чтоб во спасение срабатывало правило 50 ходов, а не 3 повторений.
Любой выигрыш по эндшпильным базам с матом более 50 ходов

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Еще такой вопрос. Может ли быть такая позиция, в которой генератор ходов, который никак не учитывает угрозы королю, не генерирует ни одного хода? Мне кажется, нет. Но не уверен на 100%.
То есть пат при ходе белых? Таких позиций полно

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Не понятно, как заставить движок приближать выбор хода, на котором требовать ничью по правилу 50 ходов. Кстати, а в UCI вообще есть команда, которая требует ничью по правилу 50 ходов?
Чем больше значение счётчика 50-ходового правила, тем более оценка должна стремиться к нулю (ничья). Чаще всего линейно. Счётчик сбрасывается, как только происходит ход пешкой, взятие, рокировка, то есть любой ход, который irreversible, не помню как по-русски.

В uci нет специальной команды предложения ничьей. Можно только показать свою оценку позиции равную нулю или около нуля. А дальше уже всё зависит от оболочки, принимает ли ничьи по показаниям движков или нет.
__________________
Наш ответ зависит от сознания людей

Последний раз редактировалось Neurocore; 31.12.2016 в 13:56.
Neurocore вне форума   Ответить с цитированием
Непрочитано 01.01.2017, 04:40   #1625
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Чем больше значение счётчика 50-ходового правила, тем более оценка должна стремиться к нулю (ничья).
Проблема в том, что игрок, имеющий материальное и позиционное преимущество, должен стараться отсрочить наступление ничьи (например, двигать пешки, совершать взятия) в надежде на ошибку противника, и наоборот, не имеющий преимущества, должен стараться приблизить наступление ничьи (не двигать пешки, не совершать взятия). Если при переборе в ничейно позиции давать оценку 0, то движок за обе стороны будет вести себя одинаково безразлично.

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Любой выигрыш по эндшпильным базам с матом более 50 ходов
Как найти? По базам никогда не искал, не анализировал.

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Счётчик сбрасывается, как только происходит ход пешкой, взятие, рокировка, то есть любой ход, который irreversible, не помню как по-русски.
В википедии в статье про 50 ходов не написано, что рокировки учитывают.

Цитата:
Согласно Словарю шахматной композиции Н. П. Зелепукина (1985), шахматные кодексы ряда стран предусматривали ещё одну особенность применения правила 50 ходов: за эти ходы не должно быть ни одной рокировки.
Какие правила сейчас применяют?

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

Последний раз редактировалось enko8086; 01.01.2017 в 05:05.
enko8086 вне форума   Ответить с цитированием
Непрочитано 01.01.2017, 12:40   #1626
Neurocore
 
Аватар для Neurocore
 
Регистрация: 18.03.2010
Адрес: г.Барнаул
Возраст: 28
Сообщений: 452
Сказал(а) спасибо: 2,587
Поблагодарили 770 раз(а) в 339 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Проблема в том, что игрок, имеющий материальное и позиционное преимущество, должен стараться отсрочить наступление ничьи (например, двигать пешки, совершать взятия) в надежде на ошибку противника, и наоборот, не имеющий преимущества, должен стараться приблизить наступление ничьи (не двигать пешки, не совершать взятия). Если при переборе в ничейно позиции давать оценку 0, то движок за обе стороны будет вести себя одинаково безразлично.
Смотрите, допустим белый считает, что у него +3, а чёрный -2. Два разных движка. До срабатывания правила 50 ходов осталось 10 ходов. Тогда их оценки должны быть скорректированы так: +3/5 = +0.6 и -2/5 = -0.4 (линейная модель). Белый растерял всё своё преимущество и должен будет искать ходы, сбрасывающие счётчик 50 ходов. А у чёрного всё хорошо - его оценка растёт. Он не будет ничего предпринимать, ничья по 50-ходовому правилу его устраивает.

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Как найти? По базам никогда не искал, не анализировал.
Например тут

Цитата:
Сообщение от enko8086 Посмотреть сообщение
В википедии в статье про 50 ходов не написано, что рокировки учитывают.
Значит я ошибся, без рокировок.

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Какие правила сейчас применяют?

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

Каждый движок вправе сам решать как ему интерпретировать 2-кратное повторение: кто-то игнорит, кто-то оценивает как почти ничья, кто-то как ничья. Но троекратное лучше считать ничейным.
__________________
Наш ответ зависит от сознания людей
Neurocore вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Chess762 (09.02.2017), enko8086 (01.01.2017)
Непрочитано 01.01.2017, 16:00   #1627
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от Neurocore Посмотреть сообщение
То есть пат при ходе белых? Таких позиций полно.
Нет, не пат. А именно полное отсутствие ходов, даже тех, которые сохраняют угрозу королю или подставляют короля под угрозу. По-моему, таких позиций очень мало. Король должен быть со всех сторон блокирован своими фигурами или краем доски. Все свои фигуры не могут никуда пойти. Мне кажется, это возможно только в позициях, похожих на мой пример. Снизу король блокирован своими пешками и сверху у края доски своими фигурами.

Цитата:
Сообщение от Neurocore
В партиях движков таким судьёй становится оболочка, вне зависимости от оценок движков она должна принимать решение о ничьей при троекратном повторении позиции.
Да, Арена фиксирует ничью при трехкратном повторении. Но на правило 50 ходов никак не реагирует. Как я понимаю, это обосновано тем, что противник даже при материальном недостатке может отказаться от ничьи по правилу 50 ходов и выиграть. А от ничьи при трехкратном повторении игрок может отказаться просто тем, что не будет повторять позицию.

Последний раз редактировалось enko8086; 01.01.2017 в 16:17.
enko8086 вне форума   Ответить с цитированием
Непрочитано 04.01.2017, 22:38   #1628
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Вопрос по поводу истории в хеш таблицах

Вопрос по поводу истории в хеш-таблицах.

Сейчас у меня так. В каждом узле вычисляется хеш значение от позиции. В хеш-таблице хранится только номер лучшего хода в данной позиции. Номер лучшего ход обновляется таблице, если получили отсечение по бета или улучшение оценки.

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

Появилась мысль использовать хеш-таблицу не только для сортировки ходов, но и для запоминания оценки, чтоб не считать повторно. Но ведь будут коллизии. Чтоб проверить, что позиция именно наша, нужно хранить полную однозначную информацию о позиции. А это порядка 64 байт. Есть ли смысл делать такое?
enko8086 вне форума   Ответить с цитированием
Непрочитано 05.01.2017, 17:30   #1629
Neurocore
 
Аватар для Neurocore
 
Регистрация: 18.03.2010
Адрес: г.Барнаул
Возраст: 28
Сообщений: 452
Сказал(а) спасибо: 2,587
Поблагодарили 770 раз(а) в 339 сообщениях
Страна:
По умолчанию Re: Вопрос по поводу истории в хеш таблицах

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Сейчас у меня так. В каждом узле вычисляется хеш значение от позиции. В хеш-таблице хранится только номер лучшего хода в данной позиции. Номер лучшего ход обновляется таблице, если получили отсечение по бета или улучшение оценки.
Лучше хранить не порядковый номер, а сам ход. Тогда при получении этого хода из хеша достаточно сделать быструю проверку на легальность хода и сразу его исполнить. Экономится время на генерацию остальных ходов. Будут часто появляться последовательности ходов, которые берутся сразу из хеша - выигрыш по скорости.

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Пробовал хранить не один ход, а 2 или 4 лучших в порядке убывания, но разницы нет, кажется, стало еще медленнее.
Тоже так пробовал. Не работает по видимому из-за того, что существенно уменьшается общее количество записей в хеше, необходимых в первую очередь для избежания оценивания повторяющихся позиций (транспозиций).

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Появилась мысль использовать хеш-таблицу не только для сортировки ходов, но и для запоминания оценки, чтоб не считать повторно. Но ведь будут коллизии. Чтоб проверить, что позиция именно наша, нужно хранить полную однозначную информацию о позиции. А это порядка 64 байт. Есть ли смысл делать такое?
Да, так делают. Хранят полный 64-битный ключ. Коллизии и в этом случае возможны, но крайне редки.
__________________
Наш ответ зависит от сознания людей
Neurocore вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Chess762 (09.02.2017)
Непрочитано 05.01.2017, 18:17   #1630
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопрос по поводу истории в хеш таблицах

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Лучше хранить не порядковый номер, а сам ход. Тогда при получении этого хода из хеша достаточно сделать быструю проверку на легальность хода и сразу его исполнить. Экономится время на генерацию остальных ходов. Будут часто появляться последовательности ходов, которые берутся сразу из хеша - выигрыш по скорости.
Хорошая идея. Надо попробовать. Хотя надо писать отдельную функцию для проверки легальности хода.

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Тоже так пробовал. Не работает по видимому из-за того, что существенно уменьшается общее количество записей в хеше, необходимых в первую очередь для избежания оценивания повторяющихся позиций (транспозиций).
В моем случае вряд ли причина в недостатке места. У меня таблица 1000 МБ. Проверял процент использования хеш-таблицы. После исследования на глубину 8 полуходов было использовано всего 0,003% таблицы.

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Да, так делают. Хранят полный 64-битный ключ. Коллизии и в этом случае возможны, но крайне редки.
Уже сам проверил. Стало хуже. Оценку из таблицы можно использовать только в том случае, если текущая глубина исследования позиции не меньше той, на которой была получена оценка. Видимо, таких случаев совсем не много и этот выигрыш не покрывает расходов на операции с полными ключами.
enko8086 вне форума   Ответить с цитированием
Непрочитано 05.01.2017, 18:22   #1631
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Хочу попробовать Null move. Идею в общем понял. Но пока не понятно, на какой глубине и сколько раз можно его делать?

Последний раз редактировалось enko8086; 05.01.2017 в 18:29.
enko8086 вне форума   Ответить с цитированием
Непрочитано 05.01.2017, 20:32   #1632
Neurocore
 
Аватар для Neurocore
 
Регистрация: 18.03.2010
Адрес: г.Барнаул
Возраст: 28
Сообщений: 452
Сказал(а) спасибо: 2,587
Поблагодарили 770 раз(а) в 339 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Хочу попробовать Null move. Идею в общем понял. Но пока не понятно, на какой глубине и сколько раз можно его делать?
Почитайте исходники. Везде по разному, я не нашёл какого-то общепринятого способа. Для вашего движка скорее всего придётся выбирать свои значения.

Но параметр редукции R рекомендуют выбирать либо 2, либо 3. Чаще всего делают зависимость от глубины.
__________________
Наш ответ зависит от сознания людей
Neurocore вне форума   Ответить с цитированием
Непрочитано 10.01.2017, 23:15   #1633
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Сделал сортировку взятий по принципу цена жертвы - цена убийцы. В некоторых многофигурных напряженных позициях ускорение по времени в 6 раз и более.

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Почитайте исходники. Везде по разному, я не нашёл какого-то общепринятого способа.
Трудно чужие исходники разбирать. Хочу сам разобраться и понять, почему именно так, а не иначе.

Правильно ли я понимаю, что нулевой ход обычно вставляют только один раз в строке (по пути от корня до вершины)?

Как можно решать проблему необнаружения цугцвангов?
enko8086 вне форума   Ответить с цитированием
Непрочитано 11.01.2017, 20:05   #1634
Neurocore
 
Аватар для Neurocore
 
Регистрация: 18.03.2010
Адрес: г.Барнаул
Возраст: 28
Сообщений: 452
Сказал(а) спасибо: 2,587
Поблагодарили 770 раз(а) в 339 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Правильно ли я понимаю, что нулевой ход обычно вставляют только один раз в строке (по пути от корня до вершины)?
Тут я не могу быть уверенным на 100%, но я делал и несколько в линии, результат не был хуже, чем если строго только 1 делать. Но тут куда более серьёзные программисты водятся, им виднее.

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Как можно решать проблему необнаружения цугцвангов?
Тупой подход - только поздний эндшпиль намечается - сразу отрубать нулевой ход. Тупо по материалу.

Ну а вообще, если знание английского хорошее, то на chessprogramming wiki вроде было про двойной нулевой ход, он вроде обходит ограничение на цугцванг.
__________________
Наш ответ зависит от сознания людей
Neurocore вне форума   Ответить с цитированием
Непрочитано 12.01.2017, 00:43   #1635
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Ну а вообще, если знание английского хорошее, то на chessprogramming wiki вроде было про двойной нулевой ход, он вроде обходит ограничение на цугцванг.
Имеется ввиду, если сработал нулевой ход, то не обрезаем, а проверяем, но на меньшую глубину?

У меня сейчас именно такая схема:

PHP код:
int Search FlagNullMovednAlphaBeta )
{
    if ( 
<= )
    {
        
// форсированный перебор 
        
return SearchFors(nAlphaBeta);    
    }

    if ( 
FlagNullMove && !Check && !LastMoveCapture && && )
    {
        
MakeNullMove();

        
d2 max(2d/2);

        
= -Searchfalsed2n+1, -Beta, -Beta 1);

        
UnMakeNullMove();

        
//если нулевой ход сработал, сразу не обрезаем, а лишь уменьшаем глубину дальнейшего поиска
        
if ( >= Beta d2
    }

    
//
    
Moves GenMoves();
    ...
    
// далее обычная схема альфа-бета, но с уменьшенной глубиной

С нулевым ходом смотрит на 1-2 полухода глубже, чем без, но играет не лучше. Стравливал с версией без нулевого хода. Кажется, с ним даже хуже играет. Может, я совсем не так что-то делаю или нормально?

Цитата:
Сообщение от Neurocore Посмотреть сообщение
Тупой подход - только поздний эндшпиль намечается - сразу отрубать нулевой ход. Тупо по материалу.
И я так сделал. Если у стороны меньше 5 фигур, считаем без нулевого хода.

Последний раз редактировалось enko8086; 12.01.2017 в 03:07.
enko8086 вне форума   Ответить с цитированием
Непрочитано 14.01.2017, 12:57   #1636
Coyote112358
 
Аватар для Coyote112358
 
Регистрация: 16.03.2010
Сообщений: 43
Сказал(а) спасибо: 7
Поблагодарили 24 раз(а) в 21 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Подскажите, друзья, можно ли как-нибудь прикрутить периодически меняющиеся шахматные задачки к своему сайту на html?
Coyote112358 вне форума   Ответить с цитированием
Непрочитано 15.01.2017, 17:48   #1637
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Вопросы по UCI.

Цитата:
ponderhit
Означает, что противник походил именно так, как и предполагалось.
Эта команда должна посылаться только в том случае, если движок находился в режиме ожидания хода противника (включается командой "ponder"). После этого движок должен продолжить анализ позиции, только уже в обычном режиме.
Проблема такая возникла. Даже не понимаю, или это глюк Арены, или я что-то не так понял.

-->1:position startpos moves e2e4
-->1:go movetime 20000
...
<--1:bestmove d7d5 ponder b1c3
-->1:position startpos moves e2e4 d7d5 b1c3
-->1:go ponder movetime 20000
...
-->1:ponderhit
... // после движок продлевает время раздумья на 20 сек и продолжает думать. Но я не всегда хочу ждать еще 20 сек. Возможен случай, когда противник думал над ходом b1c3 долго, и движок за это время подготовил хороший ответ, и я хочу сразу после ponderhit прервать расчеты и получить ответ. Но если после ponderhit нажать красный крестик, то Арена не посылает движку stop. Приходится ждать 20 сек.

Цитата:
info nodes #x
обработано #x позиций. Движок должен регулярно выдавать это сообщение.
Что понимается под числом обработанных позиций: все узлы игрового дерева или только те, на которых вызывается оценочная функция?

И еще. Где можно найти техническое описание формата эндшпильных баз для подключения к движку?

Последний раз редактировалось enko8086; 15.01.2017 в 17:50.
enko8086 вне форума   Ответить с цитированием
Непрочитано 22.01.2017, 00:04   #1638
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Нулевой ход с разным коэффициентом редукции и на разных диапазонах глубин пробовал. И с немедленным отсечением, и с сокращением глубины. Смотрит глубже, но играет хуже всегда. Как так получается. А пишут, что это очень полезная эвристика и резко увеличивает силу программы. Это вообще нормально или у меня где-то грубая ошибка?

Последний раз редактировалось enko8086; 22.01.2017 в 00:13.
enko8086 вне форума   Ответить с цитированием
Непрочитано 23.01.2017, 01:27   #1639
serg_meus
 
Регистрация: 11.12.2011
Возраст: 35
Сообщений: 72
Сказал(а) спасибо: 44
Поблагодарили 188 раз(а) в 47 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от enko8086 Посмотреть сообщение
Нулевой ход с разным коэффициентом редукции и на разных диапазонах глубин пробовал. И с немедленным отсечением, и с сокращением глубины. Смотрит глубже, но играет хуже всегда. Как так получается. А пишут, что это очень полезная эвристика и резко увеличивает силу программы. Это вообще нормально или у меня где-то грубая ошибка?
Грубых ошибок навскидку не видно. Возможно плохо, что нулевой ход не разрешается, если в цепочке ходов он уже был хотя бы один раз. У меня запрет срабатывает только на три подряд нулевых хода. Возможно, следует разрешить нулевой ход на глубине 2. Возможно, формула для глубины нулевого хода max(2, d/2) не совсем правильная, попробуйте max(2, d/2) - 1 или (d - 2) или (d - 3). И еще я сталкивался с особой ситуацией, когда портился хэш-ключ, если нулевой ход надо сделать в позиции, где возможно взятие пешки на проходе. У меня есть возможность делать проверку корректности хэш-ключа на лету, иногда очень помогает.
Резюме: добро пожаловать в компьютерные шахматы. Здесь чтобы что-либо заработало, нужно либо тщательно рассматривать большое количество возможных вариантов решений, либо копировать уже опробованные решения. В последнем случае желательно ссылаться на авторов, если решение не тривиальное.
serg_meus вне форума   Ответить с цитированием
Непрочитано 23.01.2017, 03:10   #1640
enko8086
 
Регистрация: 13.12.2016
Сообщений: 26
Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 3 сообщениях
Страна:
По умолчанию Re: Вопросы к шахматным программистам

Цитата:
Сообщение от serg_meus Посмотреть сообщение
У меня запрет срабатывает только на три подряд нулевых хода.
Я делал неограниченное кол-во ходов, но только какой-то одной стороны. Если нулевой ход сделали белые, то далее только белые могут делать нулевые ходы. Если первыми нулевой ход сделали черные, то далее только черные могут делать нулевые ходы. Мне кажется, если всем разрешить, то поиск выродится.

Сделал так. Вроде бы так играет не хуже, но и не лучше, чем без нулевого хода.
Код:
if ( FlagNullMove && !Check && !LastMoveCapture && d <= n + 2 && d > 2 )
{
    MakeNullMove(Board, BackupMove);

    P = -SearchBest(Board, d - 3, n + 1, false, -Beta, -Beta + 1);

    BackNullMove(Board, BackupMove);

    if ( P >= Beta ) return P;
}
Придумал условие на глубину d <= n + 2. То есть нулевой ход включается только на достаточной глубине, а первую половину цепочки ходов делаем по правилам. Мне кажется, это поможет избежать неправильного поведения в цугцванге.

Еще меня давно мучает вопрос четности глубины. Заметил, что при итерациях на разную базовую глубину, оценки PV при четных и нечетных глубинах различаются между собой, при этом схожи при глубинах одной четности.

Что-то типа такого:
поиск на базовую глубину 4 оценка -0,5.
на глубину 5 оценка 0,8.
на глубину 6 оценка -0,6.
на глубину 7 оценка 0,9.

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

Может, продления и сокращения в основном поиске, в том числе для нулевого хода, стоит делать только на четные глубины, чтоб в одном дереве не путались оценки с глубин разной четности? Обоснованны ли эти заботы?

Последний раз редактировалось enko8086; 23.01.2017 в 03:36.
enko8086 вне форума   Ответить с цитированием
Ответ

Социальные закладки


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шахматное программирование Vladimir50 Шахматное программирование 8 07.01.2014 19:09
Память VS Программа Overman Флейм 5 18.06.2010 19:53