Pull to refresh

Comments 46

похоже автор статьи решил сделать ещё один вариант таблицы Налимова.
Совершенно верно, изначально желание было именно таким. Но хорошенько взвесив все за и против — решил просто поставить мат конём и слоном — это и практика, и много времени тратить не нужно! Видеоуроки по созданию этой программы вышли на 12 часов…
На фото в заголовке статьи нереалистическая ситуация.
Ситация вполне возможная, если чёрный король сам будет лезть под мат.
Я об этом написал в последнем абзаце, перед разделом «Мат в 1 ход».
UFO just landed and posted this here
На первой черный король уходит с b1 на a1 из под шаха белым слоном и след ход белых конем — мат. Ситуация возможна, но черные играли в поддавки
Уважаемый, вы тексты читаете или только картинки смотрите? :)
Я привёл пример невозможного мата, и написал об этом.
UFO just landed and posted this here
Да, это невозможный мат, который нашёл алгоритм поиска всех матовых комбинаций.
Такая позиция может появится только если последний ход был превращением пешки в слона :)
Вторая невозможная.
А первая — очень даже.
Если вывести фигуры в начальную позицию
Черный король — b1
Белый — a3
Конь — a5
Слон — d1
Пусть ход белых.
d1-c2 — шах
Вместо того, чтобы тихо слопать слона, черные уходят в угол
b1-a1
Ну и дальше закономерный мат конем
a5-b3
возможная но нереалистическая, ктож под мат будет лезть намеренно :)
посчитайте мат двумя конями может, забавы ради. такой мат нельзя поставить при правильной игре черных.
ну так я и говорю. но раз у вас там просчитываются нереальные варианты мата конем и слоном, почему бы не просчитать варианты мата двумя конями. заодно можно проверить, насколько гибко все написано и не ломается ли при смене фигур, которые должны матовать.
Специально для таких увлечённых я записал процесс создания программы в виде уроков, где подробно объясняю создание всей программы. В конце курса на вип-уроке мы переделываем эту программу для мата другими фигурами. Рекомендую пройти этот курс, пока доступ открыт.
(для хранения чисел от 0 до 33 нужно таки 6 бит, а не 5)
Точно :) Просчитался, сейчас исправлю.
Зато фигуру и ход можно закодировать 5-ю битами. У коня и короля только 8 вариантов хода — это 3 бита, а у слона не более 13 вариантов. Для слона надо 4 бита, но т.к. фигур всего 3 — то один бит для слона можно взять из фигуры.
Как-то так:
0 0 NNN — король
0 1 NNN — конь
1 NNNN — слон
Гениально. Я тоже об этом много думал. Но это неоправданно усложнит алгоритм, а целого байта выиграть всё равно не выйдет.
Кстати, байтом можно закодировать ход в произвольной позиции: достаточно иметь фиксированный генератор ходов. Мы храним всего лишь номер хода, который раскрываем из генератора ходов.
Можно уложиться в 3 бита!
Объяснение
«перевернуть» задачу и хранить ходы для чёрных.

Значит, на каждую запись решения достаточно два байта:

Получается, можно и в 1 байт.
После моего предыдущего комментария должно быть очевидно
при сохранении для каждой позиции 5 бит на ход белых и ещё 3 на ход чёрных (из неё же).
В таком случае счётчик ходов вообще не нужен. В случае чего, его можно будет восстановить, переходя туда-сюда по предлагаемым ходам, пока не будет мат.
Для описания позиций, из которых результат недостижим, можно в описание хода слона добавить 14ый вариант, который будет это отмечать.
> В случае чего, его можно будет восстановить, переходя туда-сюда по предлагаемым ходам, пока не будет мат.
ага, в дереве из ~6-7 млн. узлов, с глубиной до 65 (полуходов), это почти тот же самый алгоритм, что и тот который нам эту базу рассчитывает, можно тогда уж не хранить ее вообще, а на каждом ходе рассчитывать просто лучший ход =)
После того, как найдены все оптимальные ходы, для любой позиции за можно быстро (за 65 переходов в худшем случае) найти количество ходов до конца игры.
Непосредственно во время игры рассчитывать 6-7 млн узлов нет смысла, а вот вопрос типа «за сколько ходов выиграют белые» вполне может возникнуть.
Пусть вы играете за белых и у вас есть один лучший правильный ход, но затем вам надо рассмотреть все ходы за черных, а они могут сыграть уже как угодно (до 8 ходов)
Я же предложил для каждой позиции записывать ещё и оптимальный ход чёрных (это всего лишь 3 бита). Если чёрный будет ходить неоптимально — его проблемы, это только ускорит выигрыш белых.
Оптимизация размера с одноцветным слоном не самая оптимальная, имхо )
Можно сократить размер базы в четыре раза, если рассматривать только позиции, в которых черный король находится в верхней половине доски, а белый — в левой (а слон и конь могут занимать любое поле). Ну или выбрать другую пару фигур. Все остальные позиции можно свести к этим одним или двумя отражениями (по вертикали и горизонтали)
У меня была мысль использовать только 16 позиций белого короля (левый нижний угол 4х4), а все остальные комбинации получать отражением.
Но переделывать уже не стал.
Симметрий больше чем две, так что достаточно рассмотреть всего 10 позиций короля. Кроме того, использовать симметрию можно не только в начальной позиции, но и во всем графе.
совершенно верно, это позволит сократить файл до 2,5 МиБ, но значительно усложнит алгоритм расчета графа
Так же и при чтении этой БД потом придется либо сразу распаковывать ее на «полный граф», либо при каждом ходе делать пересчет координат, читать запись и пересчитывать обратно
Если уж нужна экономия места — проще использовать сжатие, этот файл достаточно хорошо сжимается (обычным zip-ом до 6 МБ запросто)
в общем все зависит еще от того, нужна ли скорость или экономия десятка мегабайт (что не так уж и много даже для мобильного приложения)
Я точно не знаю, как устроены настоящие таблицы Налимова, но и наивный подход к использованию симметрии даст очевидную экономию. В качестве вершин графа нужно брать только «каноничные» позиции (например, где белый король находится на одном из 10 полей треугольника a1-d1-d4). На ребрах графа помимо ходов нужно добавить преобразование симметрии (элемент группы D4), такое что при применении к каноничной позиции получается требуемая. Этот граф и строить быстрее, и хранить проще, и использовать. В нем вершин примерно в 6 раз меньше, чем в исходном. Усложнение алгоритма незначительно: нужно лишь при прохождении графа перемножать преобразования (элементы группы), стоящие на ребрах, по которым проходим.
> Количество возможных комбинаций — 64 * 64 * 64 * 64 = 16,777,216.

У вас проблема с подсчётом комбинаций. Правильная цифра 64*63*62*61. Т.к., если король стоит на клетке, то там никак не может стоять конь.
Речь идёт о размере массива для хранения позиций.

Далее идёт пояснение, цитирую:
На самом деле комбинаций ещё меньше: на одной клетке не может стоять две фигуры, короли не могут стоять на соседних клетках, чёрный король не может быть под шахом и так далее. Забегая вперёд скажу, что в базе решений оказалось 5,609,790 комбинаций, массив будет заполнен на 67%.
Здесь фишка еще в том, что сама позиция записи в файле является важной информацией — это координаты фигур, если хранить только возможные позиции, тр придется хранить еще и координаты всех фигур, в итоге выйдет очень затратно и займет такой файл еще больше чем описанный
Андрей, приятно читать ваши комментарии.
Полное понимание контекста задачи, спасибо!
У вас проблема с подсчётом комбинаций. Правильная цифра 64*63*62*61. Т.к., если король стоит на клетке, то там никак не может стоять конь.

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

Очень весомое замечание.
Именно поэтому при создании визуализации для выбора хода чёрных пришлось перебирать все возможные ходы.
Спасибо.
возможно я где то ошибаюсь но картинка к посту у вас подозрительная т.к. мат слоном и конем ставиться в углу цвета слона пруфлинк.
Да, совершенно верно. Я специально такую позицию выбрал, фотографию делал сам специально для статьи.
Об этом в статье написано в последнем абзаце перед разделом «Мат в 1 ход».
Будучи школьниками, с одноклассником шутили на тему одной интересной позиции.
Белые: Слон на а1, конь на f6, король на f7 (или g6 — не имеет значения);
Чёрные: король на h8.
Ход белых. Мат в один ход.
Решение простое: конь подпрыгивает и зависает в воздухе. Назвали этот мат, как мат Рица.
Потом пришёл отец одноклассника и сказал, что мы ничего не понимаем в шахматах и сделал за чёрных простой ход — король подпрыгнул и завис в воздухе.

P. S. А почему статья здесь, а не на Хабре?
Спасибо, интересная позиция :)
Я долго думал, где опубликовать эту статью.
Почему-то решил это сделать здесь. Видимо зря :)
Только задание было «мат в полхода». С той мотивацией, что конь начинает ход, но не заканчивает.
Sign up to leave a comment.

Articles