Estou implementando um algoritmo que será bastante computacionalmente complexo e quero tentar ter certeza de que não estou fazendo um trabalho desnecessário.
Existe uma rede cúbica nxnxn, por exemplo, se n = 2, isso consiste em (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 dessa estrutura, gerarei recursivamente todos os conjuntos de m pontos, algo 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);
}
Isso pode ser chamado a partir de um set_of_points vazio.
A natureza do problema é tal que, na verdade, não preciso de toda permutação de m pontos, apenas os que são únicos sob as simetrias naturais do cubo.
Por exemplo, pegue um cubo 2x2x2 e suponha que queremos todos os conjuntos de 1 ponto. Sob o algoritmo básico acima, existem 8 conjuntos diferentes de 1 ponto.
No entanto, usando as simetrias do cubo, podemos reduzir isso para 1 conjunto único de 1 pontos, uma vez que todos os 8 originais são equivalentes sob simetrias do cubo (todos são 'cantos' neste caso).
Se o cubo for 2x2x2 em = 2, existem 28 conjuntos no algoritmo básico, mas isso reduz a apenas 3 sob simetria (por exemplo, {(0,0,0), (1,0,0)}, {(0 , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Obviamente, fazer o cálculo em 3 conjuntos de pontos é muito melhor que 28, então minha pergunta é: como faço para não gerar conjuntos de pontos que são simetricamente equivalentes a um conjunto já gerado? Ou, se isso não for possível, como posso ao menos reduzir um pouco o número de conjuntos.
(Observe - se m = 1 isso é relativamente fácil - basta escolher os pontos que estão mais próximos (0,0,0) do que qualquer um dos outros vértices, com um pouco de falsificação nos limites. É para m> 1 que isso ocorre ser um problema real)