사용자가 입력 한 입방체 위치를 해결하기 위해 폭 넓은 첫 번째 검색 알고리즘을 사용하는 2x2x2 루빅 큐브 솔버를 작성했습니다. 이 프로그램은 큐브를 해결합니다. 그러나 난 어려운 위치에 입력하면 검색에 깊이 발견 될 해결할 문제가 발생, 나는 힙 공간이 부족합니다. 내 컴퓨터에는 4GB의 RAM 만 있으며 프로그램을 실행할 때 3GB를줍니다. 나는 수색에 필요한 숫양의 양을 줄이기 위해 내가 무엇을 할 수 있는지 궁금했다. BFS의 몇 가지 측면을 변경함으로써 가능할 수 있습니다. BFS하지만 난 지금 여기에 무슨 일이 일어나고 있는지 이해할 필요가 자사의 모든 정보가 모든 코드 파일에 대한 링크는 것을 두려워RAM BFS 알고리즘 사용량 감소
static private void solve(Cube c) {
Set<Cube> cubesFound = new HashSet<Cube>();
cubesFound.add(c);
Stack<Cube> s = new Stack<Cube>();
s.push(c);
Set<Stack<Cube>> initialPaths = new HashSet<Stack<Cube>>();
initialPaths.add(s);
solve(initialPaths, cubesFound);
}
static private void solve(Set<Stack<Cube>> livePaths, Set<Cube> cubesFoundSoFar) {
System.out.println("livePaths size:" + livePaths.size());
int numDupes = 0;
Set<Stack<Cube>> newLivePaths = new HashSet<Stack<Cube>>();
for(Stack<Cube> currentPath : livePaths) {
Set<Cube> nextStates = currentPath.peek().getNextStates();
for (Cube next : nextStates) {
if (currentPath.size() > 1 && next.isSolved()) {
currentPath.push(next);
System.out.println("Path length:" + currentPath.size());
System.out.println("Path:" + currentPath);
System.exit(0);
} else if (!cubesFoundSoFar.contains(next)) {
Stack<Cube> newCurrentPath = new Stack<Cube>();
newCurrentPath.addAll(currentPath);
newCurrentPath.push(next);
newLivePaths.add(newCurrentPath);
cubesFoundSoFar.add(next);
} else {
numDupes += 1;
}
}
}
String storeStates = "positions.txt";
try {
PrintWriter outputStream = new PrintWriter(storeStates);
outputStream.println(cubesFoundSoFar);
outputStream.println(storeStates);
outputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Duplicates found " + numDupes + ".");
solve(newLivePaths, cubesFoundSoFar);
}
2x2x2 큐브의 용어는 약간 다릅니다. 8 개가 있으며 8 개로 뻗어 있습니다! 잠재적 인 주문이며, 각 조각은 3 가지 방향이 있습니다 (왜냐하면 각 조각은 3 가지 색으로 된 모서리이기 때문입니다). 그것은 우리에게 8을 줄 것입니다! * 3^7 가능한 조합. 가장 중요한 점은 큐브 전체가 6면을 가질 수 있다는 것입니다. 6면을 시계 방향으로 또는 시계 반대 방향으로 회전시켜 4 가지 색상을 위로 표시 할 수 있습니다. 8 명이 있다는 뜻! * 3^7/(6 * 4) 잠재적 조합 (360 만). @Ira Baxter – cuber
또한 모든 위치를 포함하는 파일을 가지고 있기 때문에 사용자가 큐브를 해결하려고 할 때 파일을 모두 포함하는 파일을 검색하고 파일의 각 위치가 그 위치에서 해결 된 상태로 전환하는 데 걸리는 시간. 그래서 나는 그 위치와 그 해결책을 가져 와서 다시 검색하는 것보다 훨씬 짧은 화면에 그것을 출력 할 것입니다. – cuber
또한 큐브가 결코 회전하지 않기 때문에 중복 위치를 피합니다. 퍼즐을 회전하지 않고도 퍼즐의 모든 위치에 도달 할 수있는 테스트를 위해 큐브에서 이동을 수행하므로 중복 위치로 실행하는 것이 각 위치가 고유하지 않은 문제는 아닙니다. 솔버가 큐브를 해결하기 위해 어떤 안내를하는지에 대한 질문에 대답하려면 퍼즐 세트를 사용하여 퍼즐을 시도해 볼 수 있습니다. 잠재적으로이를 해결할 수있는 큐브를 여러 가지 상태로 반복해서 이동합니다. 해결책. – cuber