Как стать автором
Обновить

Комментарии 46

похоже автор статьи решил сделать ещё один вариант таблицы Налимова.
Совершенно верно, изначально желание было именно таким. Но хорошенько взвесив все за и против — решил просто поставить мат конём и слоном — это и практика, и много времени тратить не нужно! Видеоуроки по созданию этой программы вышли на 12 часов…
На фото в заголовке статьи нереалистическая ситуация.
Ситация вполне возможная, если чёрный король сам будет лезть под мат.
Я об этом написал в последнем абзаце, перед разделом «Мат в 1 ход».
НЛО прилетело и опубликовало эту надпись здесь
На первой черный король уходит с b1 на a1 из под шаха белым слоном и след ход белых конем — мат. Ситуация возможна, но черные играли в поддавки
Уважаемый, вы тексты читаете или только картинки смотрите? :)
Я привёл пример невозможного мата, и написал об этом.
НЛО прилетело и опубликовало эту надпись здесь
Да, это невозможный мат, который нашёл алгоритм поиска всех матовых комбинаций.
Такая позиция может появится только если последний ход был превращением пешки в слона :)
Вторая невозможная.
А первая — очень даже.
Если вывести фигуры в начальную позицию
Черный король — 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. А почему статья здесь, а не на Хабре?
Спасибо, интересная позиция :)
Я долго думал, где опубликовать эту статью.
Почему-то решил это сделать здесь. Видимо зря :)
Только задание было «мат в полхода». С той мотивацией, что конь начинает ход, но не заканчивает.
в четверть хода даже)
И не мат вовсе, как оказалось.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории