재미있는 프로젝트로 저는 Richard Korf의 C # 구현-패턴 데이터베이스를 사용하여 Rubik의 큐브에 대한 최적의 솔루션 찾기를 연구했습니다.
https://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf
실제로 작동하고 솔루션을 개선하려고합니다.
Korf가 논문에서 글을 유포하는 한 가지는 패턴 데이터베이스에 저장하고 색인하는 방법입니다. 이상적으로는 루빅스 큐브의 인스턴스를 사용하여 배열에 인덱스를 생성하고 싶다고 생각합니다.
내 질문은이 인덱스를 생성하는 가장 좋은 방법에 관한 것입니다.
내 솔루션은 최소한의 완벽한 해시를 생성하는 것입니다. 여기에는 전체 패턴 데이터베이스를 발견 한 후이를 기반으로 최소의 완벽한 해시를 생성 할 때까지 모든 큐브를 메모리에 유지해야합니다. MPH는 패턴 데이터베이스 크기에 따라 실행하는 데 몇 시간이 걸리지 만 디스크에 저장 한 후 한 번만 수행하면됩니다. 결국, MPH 만 저장하는 큐브 자체를 버릴 수 있습니다. 그렇게하면 무작위 루빅스 큐브를 가져 와서 패턴을 적용 한 다음 MPH에서 배열 색인을 조회하여 예상 솔루션 길이를 얻을 수 있습니다.
Korf와 Shultz는 2005 년 논문에서 "대규모 너비 우선 검색"이라는 큐브의 인덱스를 결정하는 더 나은 방법을 설명한다고 생각합니다.
https://www.aaai.org/Papers/AAAI/2005/AAAI05-219.pdf
이 논문은 순열의 사전 식 순서에 기초하여 인덱스를 생성하는 알고리즘을 설명한다. 기본적으로 순열 {1, 2, 3}을 가져 와서 인덱스가 0 인 가장 작은 것을 알아낼 수 있습니다. {1, 3, 2}는 인덱스가 1 인 등입니다.
패턴 데이터베이스 내에서 색인을 얻기 위해이 알고리즘을 루빅스 큐브에 적용 할 수 있어야한다고 생각하지만 실제로 어떻게 작동하는지 파악하는 데 어려움을 겪고 있습니다.
예를 들어 모서리 만 패턴 데이터베이스에는 모서리 스티커가 벗겨진 모든 루빅스 큐브가 포함됩니다. 이 세트에는 정확히 88,179,840 개의 큐브가 있습니다. 루빅스 큐브의 모든 코너 큐비는 24 가지 상태 중 하나 일 수 있습니다. 8 번째 코너 큐비의 상태는 다른 7 개를 기반으로 계산 될 수 있으므로 코너 만 패턴 데이터베이스의 큐브는 각각 0과 23 사이의 7 개의 값을 갖습니다.
예를 들어 {0, 3, 6, 9, 12, 15, 18, 21}은 모든 모서리 스티커가 제거 된 "해결 된"큐브를 정의합니다.
전면을 90도 회전하면 순열은 {0, 3, 11, 23, 12, 15, 8, 20} 일 수 있습니다.
이러한 종류의 순열에서 인덱스를 얻는 방법이 있습니까?