Estoy implementando un algoritmo que será bastante complejo desde el punto de vista computacional, y quiero intentar asegurarme de que no estoy haciendo un trabajo innecesario.
Hay una red cúbica nxnxn, por ejemplo, si n = 2, esto consiste en (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1).
A partir de esta red, generaré recursivamente todos los conjuntos de puntos m, algo así como:
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);
}
Esto se puede llamar comenzando con un conjunto vacío de puntos.
La naturaleza del problema es tal que en realidad no necesito todas las permutaciones de m puntos, solo las que son únicas bajo las simetrías naturales del cubo.
Por ejemplo, tome un cubo de 2x2x2 y suponga que queremos todos los conjuntos de 1 punto. Bajo el algoritmo básico anterior, hay 8 conjuntos diferentes de 1 punto.
Sin embargo, usando las simetrías del cubo podemos reducir esto a 1 conjunto único de 1 puntos, ya que todos los 8 originales son equivalentes bajo las simetrías del cubo (en este caso, todas son 'esquinas').
Si el cubo es 2x2x2 ym = 2, hay 28 conjuntos en el algoritmo básico, pero esto se reduce a solo 3 bajo simetría (por ejemplo, {(0,0,0), (1,0,0)}, {(0 , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Obviamente, hacer el cálculo en 3 conjuntos de puntos es mucho mejor que 28, así que mi pregunta es ¿cómo hago para no generar conjuntos de puntos que sean simétricamente equivalentes a un conjunto ya generado? O si esto no es posible, ¿cómo puedo al menos reducir un poco la cantidad de series?
(Nota: si m = 1 esto es relativamente fácil, simplemente elija los puntos que están más cerca de (0,0,0) que cualquiera de los otros vértices, con un poco de dulce de azúcar en los límites. Es para m> 1 que esto ser un problema real)
