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ı?