Ich implementiere einen Algorithmus, der sehr rechenintensiv sein wird, und möchte versuchen, sicherzustellen, dass ich keine unnötige Arbeit mache.
Es gibt ein nxnxn-Kubikgitter, zB wenn n = 2, besteht dieses aus (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1).
Aus diesem Gitter werde ich rekursiv alle Mengen von m Punkten erzeugen, so etwas wie:
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);
}
Dies kann dann beginnend mit einem leeren Satz von Punkten aufgerufen werden.
Das Problem ist so beschaffen, dass ich nicht jede Permutation von m Punkten benötige, sondern nur diejenigen, die unter natürlichen Symmetrien des Würfels einzigartig sind.
Nehmen Sie zum Beispiel einen 2x2x2-Würfel und nehmen wir an, wir wollen alle Sätze von 1 Punkt. Unter dem obigen Basisalgorithmus gibt es 8 verschiedene Sätze von 1 Punkt.
Mit den Symmetrien des Würfels können wir dies jedoch auf 1 eindeutigen Satz von 1 Punkten reduzieren, da alle ursprünglichen 8 unter den Symmetrien des Würfels äquivalent sind (in diesem Fall sind sie alle "Ecken").
Wenn der Würfel 2x2x2 und m = 2 ist, gibt es 28 Sätze im Basisalgorithmus, aber dies reduziert sich unter Symmetrie auf nur 3 (z. B. {(0,0,0), (1,0,0)}, {(0) , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Offensichtlich ist die Berechnung für 3 Punktmengen viel besser als 28, daher ist meine Frage, wie ich vorgehen soll, keine Punktmengen zu generieren, die symmetrisch einer bereits erzeugten Menge entsprechen. Oder wenn dies nicht möglich ist, wie kann ich zumindest die Anzahl der Sätze ein wenig reduzieren.
(Beachten Sie - wenn m = 1 ist dies relativ einfach - wählen Sie einfach die Punkte aus, die näher an (0,0,0) liegen als alle anderen Eckpunkte, wobei an den Grenzen ein wenig verwackelt wird. Dies gilt für m> 1 ein echtes Problem sein)