Kalıp veritabanına indeksleme - Korf'un Optimal Rubik Küp çözümü


11

Eğlenceli bir proje olarak, Desen Veritabanlarını Kullanarak Rubik Küpüne En Uygun Çözümleri Bulmak İçin Richard Korf'un C # uygulaması üzerinde çalışıyorum.

https://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf

Aslında çalışıyorum, sadece çözümümü geliştirmeye çalışıyorum.

Korf'un makalesinde gizlediği bir şey, desen veritabanlarına nasıl depoladığı ve endekslediği. İdeal olarak, bir dizi içine bir dizin oluşturmak için bir rubik küpü örneğini kullanmak istediğimizi düşünüyorum.

Benim sorum bu dizini oluşturmak için en iyi yolu hakkında.

Benim çözümüm minimal mükemmel bir hash üretmek. Bu, tüm desen veritabanını bulana kadar TÜM küpleri bellekte tutmayı ve ardından buna dayanarak minimal bir mükemmel karma oluşturmayı içerir. MPH, desen veritabanı boyutuna bağlı olarak çalıştırmak için birkaç saat sürer, ancak diske kaydettiğimden beri sadece bir kez yapmam gerekir. Sonunda, sadece MPH depolayan küpleri kendileri atabilirim. Bu şekilde rastgele bir rubik küpü alabilir, deseni uygulayabilir, ardından tahmini bir çözüm uzunluğu elde etmek için MPH'de dizi dizinine bakabilirim.

Korf ve Shultz'un 2005 tarihli "Büyük Ölçekli İlk Araştırma" adlı makalesinde küpün dizinini belirlemenin daha iyi bir yolunu tanımladıklarına inanıyorum

https://www.aaai.org/Papers/AAAI/2005/AAAI05-219.pdf

Bu makalede, bir permütasyonun sözlükbilimsel düzenine dayalı bir indeks üretmek için bir algoritma açıklanmaktadır. Temel olarak {1, 2, 3} permütasyonunu alabilir ve 0 indeksine sahip en küçük olduğunu anlayabilirsiniz. {1, 3, 2}, 1 indeksi ile devam eder.

Dizini bir desen veritabanı içinde almak için bir rubik küpü için bu algoritmayı uygulamak gerekir gibi hissediyorum, ama pratikte nasıl çalışacağını bulmakta zorlanıyorum.

Köşeleri sadece desen veritabanı, örneğin kenar çıkartmaları çıkarılmış olan tüm rubik küplerini içerir. Bu sette tam olarak 88.179.840 küp var. Rubik küpü üzerindeki herhangi bir köşe küpü 24 farklı durumdan birinde olabilir. 8. köşe kübinin durumu diğer 7 temel alınarak hesaplanabilir, böylece yalnızca köşe deseni veritabanındaki küplerin her biri 0 ile 23 arasında 7 değere sahiptir.

örn. {0, 3, 6, 9, 12, 15, 18, 21}, tüm kenar çıkartmaları çıkarılmış olarak "çözülmüş" küpü tanımlar.

ön yüzü 90 derece döndürürsem permütasyon şöyle olabilir: {0, 3, 11, 23, 12, 15, 8, 20}

Bu tür permütasyonlardan bir indeks almanın bir yolu var mı?


Muhtemelen bunu ilginç bulacaksınız .
Tom van der Zanden

ilginç! gazetede bir şey "sırladığını" söylüyorsun. "etli olmayan" kısım hakkında daha spesifik olmak daha iyi olur. ayrıca çalıştığını söylüyorsun. ilk indeksleme uygulamanız nedir? bu bir okul projesi mi? daha fazla Bilgisayar Bilimi Sohbeti öner . ayrıca örneğin bloglama veya açık kaynak kodlama başkalarına yardımcı olabilir ve daha fazla ayrıntıya yol açabilir. ayrıca kağıt herhangi bir karma işlevine atıfta bulunmuyor ...
vzn

Korf'un algoritmasını uyguladım: github.com/benbotto/rubiks-cube-cracker . Ben de indekslemenin zor olduğunu gördüm, bu yüzden Orta hakkında bir makale yazdım: medium.com/@benjamin.botto/…
avejidah

Yanıtlar:


6

(pben,Öben)(p0,...,p7)(0,...,7)Öben{0,1,2}Ö7Ö0,...,Ö68!37=88179840{0,...,23}(pben,Öben)(p0,...,p7)Ö0,...,Ö637p+Ö8!Ö+p


Hey Yuval, yorum için teşekkürler. Benim için, 0 ila 23, bir köşe küpünün içinde bulunduğu benzersiz konumu / yönü nasıl tanımladığımdır. 8 konum kez konum başına 3 yön = 24 Neyse ki bu değeri kolayca ayrı konum / yönlendirme tuplesine bölebilirim. Cevabınız beni tanımladığınız algoritmanın bir uygulaması olan bu koda götürdü. github.com/brownan/Rubiks-Cube-Solver/blob/master/cornertable.c Bunu daha genel hale getirmek için biraz çalışmam gerekecek (böylece "yalnızca köşeler" den farklı kalıpları kaldırabileceğim) ama şimdi Doğru yolda olduğum thx!
Kozmos
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.