Zoombinis'i Kaptan Cajun'un feribotuna oturtmak için algoritma mı?


12

Yakın zamanda Zoombinis'in The Logical Journey (Mantıksal Yolculuğu) ' nun yeniden çıkışını oynuyorum ve çeşitli bulmacaları çözebilecek bazı bilgisayar algoritmaları uygulamaya çalışıyorum. Kaptan Cajun'un feribot bulmacasına nasıl yaklaşacağım üzerine sıkıştım.

Tanıdık olmayanlar için Zoombini 4 özelliği olan bir yaratıktır: saç, gözler, burun ve ayaklar. Bu özelliklerin her birinin 5 olası değeri vardır; örneğin, bir Zoombini'nin ayakları tekerlekler, tekerlekli patenler, spor ayakkabılar, bir yay veya bir pervane olabilir. Dağınık saçlı, gözlüklü, yeşil burunlu ve spor ayakkabılı bir Zoombini örneği:

Feribot yapbozunda görev, bir feribotun 16 koltuğu üzerinde 16 Zoombinis koleksiyonu düzenlemektir. Düzenleme, ortogonal olarak komşu iki koltuğun en az bir özelliği paylaşan Zoombinis tarafından işgal edilmesi gerektiği kuralına uymak zorundadır. İki Zoombinis'in farklı saçları, farklı gözleri, farklı burunları ve birbirinden farklı ayakları varsa, yan yana oturamayabilirler.

Koltukların yerleşimi seviyeye göre değişir; Somutluk için, 16 koltuğun 4'e 4 ızgarada düzenlendiği "Çok Sert" seviyesine odaklanalım. İşte 15 Zoombinis'in yasal olarak oturduğu bir örnek, ancak rıhtımda duran son Zoombini son boş koltuğa yerleştirilemez, çünkü sağındaki Zoombini ile hiçbir özellik paylaşmaz:

Neredeyse tamamlanmış bulmaca örneği

16 tane var! Zoom 21 trilyon olası Zoombinis'in koltuklara atanması. Bu nedenle, yasal olup olmadığını görmek için mümkün olan her ödevi yürütmek pratik olmayacaktır. Bu soruna mantıklı yaklaşmak için kullanabileceğim bazı sezgisel yöntemler nelerdir?


2
Bana sudoku hatırlatıyor ve sudoku çözücüler genellikle bir tür geri izleme uyguluyorlar.
mattecapu

2
Daha karmaşık literatürleri araştırmaya hazır ve istekli iseniz, o zaman arayarak faydalı bilgiler bulabilirsiniz Subgraph Isomorphism Problem. Sorun, başka bir grafikte bir grafik bulmaktır. Sizin durumunuzda alt çizgi oturma (kenarlar bitişiktir) olurken, ana grafik zoombiniler olacaktır, burada bağlantılar paylaşılan bir özelliğin varlığı olacaktır. Genel olarak sorunun NP-tamamlanmış olduğunu ve genellikle geri izleme ile yapıldığını unutmayın, ancak bazı özel durumlar için (grafiğiniz çok iyi olabilir), polinom veya hatta doğrusal çözümler mümkündür.
Sıradan

Bu harika bir fikir, zoombinis'i bir çocuk olarak sevdim - sadece aynı şeyi yapabilirim!
AlexFoxGill

Yanıtlar:


8

"Backtracking algoritması" nın yararlı Google arama terimi için @mattecapu'ya teşekkürler. Bu bana gerekli düşünce için yiyecek verdi.

Şu anki sezgim, en başta 4 komşusu olan orta koltukları doldurmanın ve sadece 2 komşusu olan köşe koltuklarını (daha sonra) doldurmanın daha iyi olabileceğidir. Bu yüzden 16 boş sandalyeyi bu sırayla bağlantılı bir listeye yerleştiriyorum:

13   5   6  14

 7   1   2   9

 8   3   4  10

15  11  12  16

İşte yazarken yaraladığım işlevi açıklayan bazı sözde kod. Bağlantılı listedeki ilk koltuğa 16 Zoombinis ve bir işaretçi içeren bir liste beslersiniz.

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

Aslında şaşırtıcı derecede hızlı çalışıyor! Bundan çok memnun kaldım.

Koltuk listesini mümkün olan en iyi sırada düzenlediğimden henüz tam olarak ikna olmadım. Sorunla ilgili toplam 24 kısıtlama vardır ve ideal koltuk doldurma sırası, koltuk doldurma sürecinde mümkün olan en erken zamanda bu kısıtlamaların her biri ile yüzleşir, böylece uygun olmayan dallar maksimum hızlı bir şekilde budanır.


1
Eğer doldururken 8size sadece komşu konum 2, ancak dolum olabilir 9hem komşudur 7ve 3. güzel iş olsa çözme!
AlexFoxGill

Düzenlemeyi yaptı; yine de, iç-dış şemanın sadece satır satır doldurarak atıp atmadığından emin değilim. Belki bazı zamanlama testleri yapacağım.
thecommexokid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.