Sto implementando un algoritmo che sarà abbastanza complesso dal punto di vista computazionale e voglio provare ad assicurarmi che non sto facendo un lavoro inutile.
Esiste un reticolo cubico nxnxn, ad esempio se n = 2 è costituito da (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1).
Da questo reticolo genererò ricorsivamente tutti gli insiemi di punti m, qualcosa del tipo:
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);
}
Questo può quindi essere chiamato a partire da un set_of_points vuoto.
La natura del problema è tale che in realtà non ho bisogno di ogni permutazione di punti m, ma solo quelli che sono unici sotto le simmetrie naturali del cubo.
Ad esempio, prendi un cubo 2x2x2 e supponiamo di volere tutti i set di 1 punto. Sotto l'algoritmo di base sopra, ci sono 8 diversi set di 1 punto.
Tuttavia, usando le simmetrie del cubo possiamo ridurre questo fino a 1 set unico di 1 punti, poiché tutti gli 8 originali sono equivalenti alle simmetrie del cubo (in questo caso sono tutti "angoli").
Se il cubo è 2x2x2 e m = 2, ci sono 28 insiemi nell'algoritmo di base, ma questo si riduce a solo 3 sotto simmetria (es. {(0,0,0), (1,0,0)}, {(0 , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Ovviamente fare il calcolo su 3 serie di punti è molto meglio di 28, quindi la mia domanda è: come faccio a non generare serie di punti che sono simmetricamente equivalenti a una serie già generata? O se ciò non è possibile, come posso almeno ridurre un po 'il numero di set.
(Nota - se m = 1 questo è relativamente facile - basta scegliere i punti che sono più vicini a (0,0,0) rispetto a qualsiasi altro vertice, con un po 'di confusione ai confini. È per m> 1 che questo ottiene essere un vero problema)