Bir rubik küpünün toplam tetrad bükülmesini hesaplamanın yolu
Bir Rubik küpünü çözmek için Thistlewaite algoritmasının bir uygulaması üzerinde çalışıyorum ve şimdi tetrad bükülmeleri sorunuyla karşı karşıyayım. Bu cevap sayesinde , onların ne olduklarını ve 3. aşamadaki durum miktarını nasıl düşürdüklerini anlıyorum, ancak sahip olduğum sorun, bir küpün toplam tetrad bükülmesini yalnızca durumundan hesaplamanın bir yolunu bulmak.
Bu algoritmayı uygulama şeklim, kapsamlı bir aramayla değildir ve bu nedenle, burada ve burada bulunan daha güçlü koşulu , aşama 3'ü bitirip bitirmediğimi bilmek için kullanamam çünkü bu benim için yararlı değil. Bunu yapma şeklim, arama tablolarını önceden hesaplamak ve belirli bir durumu çözmeyi bilmek için onlara bakmaktır. Bu nedenle, farklı 3. aşama durumlarını ayırt etmek için gereken bilgileri tam olarak karakterize etmem gerekiyor. Halihazırda köşe tetradlarım, kenar dilimlerim ve parite yaptım, ihtiyacım olan son şey bir durumun tetrad kıvrımını (veya herhangi bir eşdeğer bilgiyi) ifade etmenin bir yolu. En iyisi, basitçe 0, 1 veya 2 arasında bir değer verebilmek ve bunu toplam bükülmeyi tanımlamak için kullanabilmektir.
Umarım sorum nettir ve değilse, yorumlarda soru sormaktan çekinmeyin, daha fazla açıklamak için elimden gelenin en iyisini yapacağım.
Yanıtlar
Bu bilgiyi direk olarak köşe parçalarının mevcut konumlarından çıkarmak oldukça zordur. Açık farkla en kolay yol, bu köşe parçalarını yalnızca yarım dönüşler kullanarak çözmeye çalışmak (kenar parçalarını görmezden gelerek) ve ne kadar ilerlediğinizi görmektir.
Şimdilik köşe parçalarının doğru dörtlü yörüngelerinde (UFR, UBL, DFL, DBR} ve {UFL, UBR, DFR, DBL}) bulunduğunu varsayacağım. Bir tetradın parçalarını gerçekten çok kolay, her parça için yarım turdan fazla, toplamda en fazla 3 hamle çözebilirsiniz. Örneğin, DBR'yi en fazla {D2, B2, R2}, ardından en fazla {F2, L2} kullanarak DFL'yi ve son olarak gerekirse UFR'yi de çözen {U2} kullanarak UBL'yi çözün.
Daha sonra ikinci tetradın bir parçasını, örneğin DBL'yi, {F2 L2 F2 U2, U2 F2 U2 L2, L2 U2 L2 F2} hareket dizilerinden birini kullanarak çözersiniz. Bu hareket dizileri, ikinci tetradın dört parçası üzerinde çift takas gerçekleştirir ve ilk tetrayı sabit tutan olası tek permütasyonlardır.
Bu, çözülmemiş üç parça bırakır, {UFL, UBR, DFR}. Bunlar 3! = 6 permütasyondan herhangi birinde olabilir. Bu 6 olasılık, permütasyon paritesiyle birlikte tetrad bükülmesini temsil eder, bu nedenle bu permütasyonu 0'dan 5'e kadar bir sayıya eşlerseniz, hem permütasyon paritesini hem de tetrad bükülmesini tek bir sayıya kodlamış olursunuz.
Thistlethwaite algoritması için, muhtemelen algoritmanın üçüncü aşamasının rastgele bir konumunu kodlamak isteyeceksiniz. Bu, tutarlı bir şekilde yapılmalıdır, bununla, eğer iki farklı pozisyon aynı hareket sekansı ile dördüncü aşamaya getirilirse (yani, bu pozisyonlara hareket sırasını uyguladıktan sonra her ikisi de sadece yarım dönüşler kullanılarak çözülebilir hale gelir) demek istiyorum. bu iki konum 3. aşama için aynı kodlamaya sahip olmalıdır.
Muhtemelen programınız küpün köşe konumlarını belirli bir sabit sırayla listeler. Örneğin,
UFR , UFL, UBL , UBR, DFR, DFL , DBL, DBR sırasındaki konumları temsil eden bir uzunluk dizisi 8 olabilir .
Dizideki 0, 2, 5, 7 indekslerindeki tetradlardan birini temsil eden yerleri kalın yazdım. Programınızda farklı bir sıralama kuralı seçmiş olabilirsiniz, ancak yöntem aynıdır.
Şimdi keyfi bir aşama 3 küp pozisyonunuz olduğunu ve bu 8 köşenin bazı rastgele permütasyonuna sahip olduğunuzu varsayalım, örneğin:
UBR, UBL , DBR , DFR, DFL , UFR , UFL, DBL.
Parçaları iki tetrada ayırmanın basit ve tutarlı bir yolu, iki tür parçayı, göreceli sıralarını değiştirmeden tam anlamıyla ayırmaktır:
UBL , DBR , DFL , UFR
UBR, DFR, UFL, DBL.
Ve sonra bunları, sırayla, her biri doğru tetrad konumlarına yerleştirmek için depolama dizisine yerleştirin. Böylece ilk küme 0,2,5,7 endekslerine, diğeri 1,3,4,6 endekslerine giriyor.
UBL , UBR, DBR, DFR, UFL, DFL , DBL, UFR .
Şimdi, tetrad büküm ve parite konumlarının tutarlı bir kodlamasını tamamlamak için, başlangıçta açıkladığım çözme tekniğini uygulayabilirsiniz.
Yukarıda, küpü temsil etmek için tek bir standart yol kullandığınızı ve buna hamleler uyguladığınızı varsayar. Bunun yerine, tetrad parçalarının iki ayrı listesini bu pozisyonun basitleştirilmiş bir temsili olarak tutmak isteyebilir ve bunları çözerken doğrudan bükme + parite kodlamasını çıkarmak için bunları değiştirmeyi isteyebilirsiniz.
Bu eski küp programlama yarışmasındaki bazı programlara bir göz atabilirsiniz , ancak anlaşılabilirlik için değil kısalık için yazıldıkları için çok yardımcı olacaklarından emin değilim.