Существует математическая модель, который мы пользуемся при раздаче карт, по которой наша Косынка сходится почти всегда (99%). Хотя мы и пишем 100%, это не совсем так и если Вы будете играть онлайн в Косынку, то в 1 случае из 100 Вам представится возможность в этом убедиться.
Если при раздаче открытыми на столе или в закрытой колоде находятся 4 туза, то пасьянс сходится на 100%.
Оценить сходимость случайного расклада онлайн пасьянса Косынка методом перебора - достаточно трудоемкая компьютерная задача.
Сгенерировать пасьянс косынка от обратного, т.е. разложив на стол карты - задача того же порядка сложности, что и оценка сходимости случайного расклада.
Существует ошибочное мнение, что пасьянс «Косынка» сходится всегда. Я думаю, вызвано это версией
в
ОС Windows, в которой расклады уже заложены, а не генерируются каждый раз.
Вопрос сходимости возник при создании сайта с пасьянсами, для которого нужны были расклады,
выдаваемые пользователям. Для начала мы решили написать один из самых простых и распространенных
вариантов игры — «Косынку» и не найдя готовую базу, стали генерировать случайные расклады.
Написав
JS код для игры мы обнаружили, что сходятся случайные расклады очень редко. На ~50 игр у нас
сошлась
только одна. Подсовывать пользователям пасьянс, который не сходится — не самый удачный вариант
для
сайта, поэтому стали искать пути выхода.
Выход первый — это забрутфорсить случайный расклад и определить сходимость. Помимо сложности
алгоритма этот вариант еще и требовал каких-то неимоверных вычислительных мощностей, примерно,
как
обсчет партии в шашки. (В среднем пасьянс сходится за чуть более 100 ходов, при этом в процессе
игры
не всегда нужно выкладывать на стол карту). Этот вариант отпал.
Тогда решили написать правила для генератора пасьянса, посчитав что это будет более простой
путь.
Напомню, что в «Косынке» участвует 52 карты от двойки до туза 4-х мастей. Закрыты на столе в 7
стопках 21 карта, открыты на столе 7 и 24 карты в колоде, которую можно крутить. Нас интересуют
для
обсчета карты, которые в колоде и уже открытые на столе (всего 31 карта), т.к. именно ими игрок
оперирует.
Правило при генерации добавили такое — среди карт в колоде и открытых на столе (31 карта) должна
быть одна полная комбинация красных карт от двойки до туза и одна комбинация черных карт от
двойки
до туза. После применения такого правила генератор стал выдавать 1 из 150 раскладов
удовлетворяющих
условию (149 соответственно откидывал).
Сходимость таких раскладов резко повысилась и стала ~90% (по данным на 10.000 раскладов — 979 не
сошлось ни разу, 9021 сошлось). Проверить такое количество раскладов нам помог краудсорсинг и
наши
пользователи, которые играли в пасьянс «Косынку».
P.S.: Мы пробовали разные правила применять при генерации, но расклады получались либо совсем
простые и играть в них было не интересно (когда генератор выдавал нам 1 расклад из 1.000), либо
их
сходимость не поднималась до приемлемых значений. Спасибо за потраченное время и если Вы знаете
правило (универсальный алгоритм) определения сходимости — буду рад прочитать про него.
Если про Косынку Вам всё понятно, можете разложить Паук одной масти или прочитать про сходимость Паука