Sto implementando un algoritmo che sarà abbastanza complesso dal punto di vista computazionale e voglio provare ad assicurarmi che non stia facendo del lavoro non necessario.
C'è un reticolo cubico n x n x n, ad es. se n = 2 questo è composto 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 m punti, qualcosa come:
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 non ho realmente bisogno della permutazione ogni dei m punti, 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 ridurlo a 1 unico set di 1 punti, poiché tutti gli 8 originali sono equivalenti sotto le simmetrie del cubo (in questo caso sono tutti 'angoli').
Se il cubo è 2x2x2 e m = 2, ci sono 28 set nell'algoritmo di base, ma questo si riduce a soli 3 sotto simmetria (es. {(0,0,0), (1,0,0)}, {(0,0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Ovviamente il calcolo su 3 serie di punti è molto meglio di 28, quindi la mia domanda è: come faccio a non generare set di punti che sono simmetricamente equivalenti a un set già generato? O se questo non è possibile, come posso ridurre almeno 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 dei vertici, con un po 'di confusione ai limiti. È per m > 1 questo diventa un vero problema)