상당히 계산적으로 복잡한 알고리즘을 구현 중이며 불필요한 작업을 수행하지 않도록 노력하고 싶습니다.
nxnxn 입방 격자가 있습니다. 예를 들어 n = 2 인 경우 (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1).
이 격자에서 나는 다음과 같은 모든 m 포인트 세트를 재귀 적으로 생성 할 것입니다.
solve(set_of_points) {
if set_of_points.size = m, finish
do some useful computation here
for each point in lattice not in set_of_points:
solve(set_of_points + new_point);
}
그런 다음 빈 set_of_points로 시작하여 호출 할 수 있습니다.
문제의 본질은 실제로 m 점의 모든 순열이 필요하지 않으며 큐브의 자연 대칭에서 고유 한 점만 필요 합니다 .
예를 들어 2x2x2 큐브를 가져 와서 모든 1 점 세트를 원한다고 가정합니다. 위의 기본 알고리즘에 따라 8 개의 서로 다른 1 점 세트가 있습니다.
그러나 큐브의 대칭을 사용하면 큐브의 대칭에서 원래 8 개가 모두 동일하므로 (이 경우에는 모두 '모퉁이'이므로) 1 개의 고유 한 1 점 세트로이를 줄일 수 있습니다.
큐브가 2x2x2이고 m = 2 인 경우 기본 알고리즘에는 28 개의 세트가 있지만 대칭 (예 : {(0,0,0), (1,0,0)}, {(0 , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
분명히 3 세트의 포인트에서 계산을 수행하는 것이 28보다 훨씬 낫습니다. 따라서 제 질문은 이미 생성 된 세트와 대칭 적으로 동일한 포인트 세트를 생성하지 않는 방법입니다. 또는 이것이 가능하지 않은 경우 어떻게 최소한 세트 수를 조금 줄일 수 있습니까?
(참고-m = 1 인 경우 비교적 쉽습니다. 경계에서 약간 헷갈 리면서 다른 정점보다 (0,0,0)에 가까운 점을 선택하면됩니다. m> 1의 경우 진짜 문제가 되려면)