Я недавно играл в переиздание The Logical Journey of Zoombinis и пытаюсь реализовать некоторые компьютерные алгоритмы, которые могут решать различные головоломки. Я застрял на том, как подойти к загадке парома Капитана Каджуна.
Для тех, кто незнаком, Zoombini - это существо с 4 атрибутами: волосы, глаза, нос и ступни. Каждый из этих атрибутов имеет 5 возможных значений; например, ногами Zoombini могут быть колеса, роликовые коньки, кроссовки, пружина или пропеллер. Вот пример Zoombini с грязными волосами, очками, зеленым носом и кроссовками:
В головоломке с паромом задача состоит в том, чтобы собрать коллекцию из 16 зомби на 16 сиденьях парома. Компоновка должна подчиняться правилу, согласно которому любые два ортогонально соседних места должны быть заняты Zoombinis, которые имеют хотя бы одну особенность. Если два зоомбини имеют разные волосы, разные глаза, разные носы и разные ноги, они могут не сидеть рядом друг с другом.
Расположение сидений меняется в зависимости от уровня; для конкретности, давайте сосредоточимся на уровне «Очень жесткий», в котором 16 мест расположены в сетке 4 на 4. Вот пример, где 15 Зоомбини были юридически размещены, но последний Зоомбини, стоящий на скамье подсудимых, не может быть размещен на последнем свободном месте, потому что она не будет иметь никаких особенностей с Зоомбини справа от нее:
Есть 16! ≈ 21 триллион возможных назначений Зомбини на места. Так что просто пробежаться по каждому возможному заданию, чтобы увидеть, законно ли это, не будет практичным. Какие эвристики я мог бы использовать для разумного подхода к этой проблеме?
Subgraph Isomorphism Problem
. Проблема в том, чтобы найти один граф в другом. В вашем случае подграфом будет размещение (ребра - смежность), в то время как родительским графом будет zoombinis, где в соединениях будет присутствовать общая черта. Обратите внимание, что в общем случае задача является NP-полной и обычно выполняется также путем обратного отслеживания, однако для некоторых особых случаев (из которых ваш граф вполне может быть) возможны полиномиальные или даже линейные решения.