Алгоритм рассадки Зомбини на пароме капитана Кахуна?


12

Я недавно играл в переиздание The Logical Journey of Zoombinis и пытаюсь реализовать некоторые компьютерные алгоритмы, которые могут решать различные головоломки. Я застрял на том, как подойти к загадке парома Капитана Каджуна.

Для тех, кто незнаком, Zoombini - это существо с 4 атрибутами: волосы, глаза, нос и ступни. Каждый из этих атрибутов имеет 5 возможных значений; например, ногами Zoombini могут быть колеса, роликовые коньки, кроссовки, пружина или пропеллер. Вот пример Zoombini с грязными волосами, очками, зеленым носом и кроссовками:

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

Расположение сидений меняется в зависимости от уровня; для конкретности, давайте сосредоточимся на уровне «Очень жесткий», в котором 16 мест расположены в сетке 4 на 4. Вот пример, где 15 Зоомбини были юридически размещены, но последний Зоомбини, стоящий на скамье подсудимых, не может быть размещен на последнем свободном месте, потому что она не будет иметь никаких особенностей с Зоомбини справа от нее:

Пример почти готовой головоломки

Есть 16! ≈ 21 триллион возможных назначений Зомбини на места. Так что просто пробежаться по каждому возможному заданию, чтобы увидеть, законно ли это, не будет практичным. Какие эвристики я мог бы использовать для разумного подхода к этой проблеме?


2
Это напоминает мне о судоку, и решатели судоку обычно реализуют своего рода возврат.
Mattecapu

2
Если вы готовы и хотите изучить более сложную литературу, вы можете найти полезную информацию, выполнив поиск Subgraph Isomorphism Problem. Проблема в том, чтобы найти один граф в другом. В вашем случае подграфом будет размещение (ребра - смежность), в то время как родительским графом будет zoombinis, где в соединениях будет присутствовать общая черта. Обратите внимание, что в общем случае задача является NP-полной и обычно выполняется также путем обратного отслеживания, однако для некоторых особых случаев (из которых ваш граф вполне может быть) возможны полиномиальные или даже линейные решения.
Ордус

это отличная идея, я любил zoombinis в детстве - я мог бы просто сделать то же самое!
AlexFoxGill

Ответы:


8

Спасибо @mattecapu за полезный поисковый запрос Google для "алгоритма возврата". Это дало мне пищу для размышлений, в которых я нуждался.

Моя текущая интуиция состоит в том, что, возможно, было бы лучше заполнить центральные места - у которых есть 4 соседа - сначала, и сохранить угловые места - у которых есть только 2 соседа - для последнего. Итак, я расположил 16 свободных мест в связанном списке в следующем порядке:

13   5   6  14

 7   1   2   9

 8   3   4  10

15  11  12  16

Вот некоторый псевдокод, который описывает функцию, которую я написал. Вы передаете ему список, содержащий 16 зоомини и указатель на первое место в связанном списке.

function recursively_assign_seat(zoombini_list, seat):

    if zoombini_list is empty:
        return True

    else:
        for each z in zoombini_list:

            for each n in seat.neighbors:
                if not allowed_as_neighbors(z, n):
                    next z

            seat.occupant ← z
            if recursively_assign_seat(zoombini_list.remove(z), seat.next):
                return True
            else:
                seat.occupant ← None

        return False

Это на самом деле работает на удивление быстро! Я был очень доволен этим.

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


1
когда вы заполняете, 8вы только смежны 2, но вы можете заполнять, 9что смежно с обоими 7и 3. хорошая работа, решающая это все же!
AlexFoxGill

Сделал это редактировать; все еще не уверен, что схема наизнанку превосходит просто заполнение строка за строкой, хотя. Может быть, я сделаю некоторые тесты времени.
thecommexokid
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.