패턴 데이터베이스로 색인 생성-Korf의 Optimal Rubik 's Cube 솔루션


11

재미있는 프로젝트로 저는 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} 일 수 있습니다.

이러한 종류의 순열에서 인덱스를 얻는 방법이 있습니까?


아마도 이것이 흥미로울 것입니다.
Tom van der Zanden

흥미로운! 당신은 그가 종이에 뭔가 "유약"한다고 말합니다. "가공되지 않은"섹션에 대해 더 구체적으로 작성하는 것이 좋습니다. 또한 작동한다고 말합니다. 초기 색인 구현은 무엇입니까? 이것은 학교 프로젝트입니까? 그것에 대한 추가 컴퓨터 과학 채팅 을 제안 하십시오. 또한 예를 들어 블로그에 대한 블로깅 또는 공개 소싱은 다른 사람들에게 도움이 될 수 있으며 더 자세한 정보를 얻을 수 있습니다. 또한이 논문은 해싱 함수를 언급하지 않는 것 같습니다.
vzn

Korf의 알고리즘 인 github.com/benbotto/rubiks-cube-cracker를 구현 했습니다 . 나도 색인 생성이 어렵다는 것을 알았으므로
avejidah

답변:


6

(pi,oi)(p0,,p7)(0,,7)oi{0,1,2}o7o0,,o68!37=88179840{0,,23}(pi,oi)(p0,,p7)o0,,o637p+o8!o+p


유발, 댓글 주셔서 감사합니다. 나를 위해 0에서 23까지는 코너 큐브가있을 수있는 고유 한 위치 / 방향을 식별하는 방법입니다. 8 위치 x 위치 당 3 방향 = 24입니다. 다행히도이 값을 별도의 위치 / 방향 튜플로 쉽게 나눌 수 있습니다. 귀하의 답변으로 귀하가 설명하는 알고리즘의 구현 인이 코드로 연결되었습니다. github.com/brownan/Rubiks-Cube-Solver/blob/master/cornertable.c 좀 더 일반적인 작업을 수행하기 위해 약간의 작업을해야합니다 ( "코너 만"과는 다른 패턴을 처리 할 수 ​​있습니다). 올바른 궤도에 임!
Cosmosis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.