J'implémente un algorithme qui va être assez complexe sur le plan informatique et je veux essayer de m'assurer que je ne fais pas de travail inutile.
Il existe un réseau cubique nxnxn, par exemple si n = 2, il se compose de (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1).
À partir de ce réseau, je générerai récursivement tous les ensembles de m points, quelque chose comme:
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);
}
Cela peut ensuite être appelé en commençant par un set_of_points vide.
La nature du problème est telle que je n'ai pas réellement besoin de chaque permutation de m points, juste ceux qui sont uniques sous les symétries naturelles du cube.
Par exemple, prenez un cube 2x2x2 et supposons que nous voulons tous les ensembles de 1 point. Sous l'algorithme de base ci-dessus, il existe 8 ensembles différents de 1 point.
Cependant, en utilisant les symétries du cube, nous pouvons réduire cela à 1 ensemble unique de 1 points, car tous les 8 originaux sont équivalents sous les symétries du cube (ils sont tous des `` coins '' dans ce cas).
Si le cube est 2x2x2 et m = 2, l'algorithme de base contient 28 ensembles, mais cela se réduit à seulement 3 sous symétrie (par exemple {(0,0,0), (1,0,0)}, {(0 , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Évidemment, le calcul sur 3 ensembles de points est bien meilleur que 28, alors ma question est de savoir comment ne pas générer d'ensembles de points qui sont symétriquement équivalents à un ensemble déjà généré? Ou si cela n'est pas possible, comment puis-je au moins réduire un peu le nombre de jeux.
(Remarque - si m = 1, cela est relativement facile - il suffit de choisir les points qui sont plus proches de (0,0,0) que tous les autres sommets, avec un peu de fudging aux limites. C'est pour m> 1 que cela devient être un vrai problème)