Алгоритм сидіння Zoombinis на паромці капітана Каджуна?


12

Я нещодавно грав у випуску «Логічного подорожі Zoombinis» і намагаюся реалізувати деякі комп’ютерні алгоритми, здатні вирішувати різні головоломки. Я застряг у тому, як наблизитись до головоломки паромного капітана капітана Каджуна.

Для незнайомих, Zoombini - істота з чотирма атрибутами: волосся, очі, ніс і стопи. Кожен з цих атрибутів має 5 можливих значень; наприклад, ногами Zoombini можуть бути колеса, роликові ковзани, кросівки, пружина або гвинт. Ось приклад Zoombini з брудним волоссям, окулярами, зеленим носом і кросівками:

У головоломці на поромі завдання полягає в тому, щоб організувати колекцію з 16 Zoombinis на 16 місць поромного човна. Домовленість повинна підкорятися правилу, згідно з яким будь-які два ортогонально сусідніх місця повинні бути зайняті Zoombinis, які мають принаймні одну особливість. Якщо два зумбіни мають різне волосся, різні очі, різний ніс і різні стопи один від одного, вони можуть не сидіти поруч.

Розташування сидінь змінюється за рівнем; задля конкретності, зосередимось на рівні «Дуже важко», в якому 16 місць розташовані в сітці 4 на 4. Ось приклад, коли 15 Zoombinis були законно сиділи, але остаточний Zoombini, що стоїть на лаві підсудних, не може бути розміщений на останньому порожньому сидінні, оскільки вона не має жодних особливостей із Zoombini праворуч:

Приклад майже завершеної головоломки

Є 16! ≈ 21 трлн можливих призначень Zoombinis на місця. Тому просто пробігнути всі можливі завдання, щоб побачити, чи законний це не буде практичним. Які евристики я можу використати, щоб розумно підійти до цієї проблеми?


2
Мені це нагадує судоку, і вирішувачі судоку зазвичай здійснюють якусь зворотній трек.
mattecapu

2
Якщо ви готові і готові розібратися з більш складною літературою, ви можете знайти корисну інформацію, шукаючи Subgraph Isomorphism Problem. Проблема полягає у пошуку одного графа в іншому графіку. У вашому випадку підграфом буде розміщення (краї є суміжними місцями), тоді як батьківський графік буде zoombinis, де з'єднаннями буде наявність спільної ознаки. Зауважте, що загалом проблема є NP-повною, і зазвичай це робиться і зворотним відстеженням, однак для деяких особливих випадків (з яких ваш графік цілком може бути) можливі поліномічні або навіть лінійні рішення.
Звичайний

це відмінна ідея, я любив зомбіни ще в дитинстві - я можу просто зробити те саме!
AlexFoxGill

Відповіді:


8

Дякуємо @mattecapu за корисний пошуковий термін Google "алгоритм зворотного відстеження". Це дало мені їжу для думки, яка мені потрібна.

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

13   5   6  14

 7   1   2   9

 8   3   4  10

15  11  12  16

Ось псевдокод, який описує функцію, яку я завершив писати. Ви подаєте йому список, що містить 16 Zoombinis та вказівник на перше місце у пов'язаному списку.

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.