Wdrażam algorytm, który będzie dość skomplikowany obliczeniowo, i chcę się upewnić, że nie wykonuję niepotrzebnej pracy.
Istnieje sieć sześcienna nxnxn, np. Jeśli n = 2, to składa się z (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1).
Z tej sieci będę rekurencyjnie generować wszystkie zestawy m punktów, coś w stylu:
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);
}
Można to następnie wywołać zaczynając od pustych set_of_points.
Charakter problemu jest taki, że tak naprawdę nie potrzebuję każdej permutacji punktów m, tylko tych, które są unikalne pod naturalną symetrią sześcianu.
Na przykład weź sześcian 2x2x2 i załóżmy, że chcemy wszystkich zbiorów 1 punktu. Zgodnie z powyższym algorytmem podstawowym istnieje 8 różnych zestawów 1 punktu.
Jednak używając symetrii sześcianu, możemy zmniejszyć to do 1 unikalnego zestawu 1 punktów, ponieważ wszystkie oryginalne 8 są równoważne pod symetriami sześcianu (w tym przypadku wszystkie są „narożnikami”).
Jeśli sześcian ma wymiary 2x2x2 i m = 2, w algorytmie podstawowym jest 28 zestawów, ale zmniejsza się do zaledwie 3 przy symetrii (np. {(0,0,0), (1,0,0)}, {(0 , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Oczywiście wykonanie obliczeń na 3 zestawach punktów jest znacznie lepsze niż 28, więc moje pytanie brzmi: jak mogę generować zestawy punktów, które są symetrycznie równoważne zestawowi już wygenerowanemu? Lub jeśli nie jest to możliwe, w jaki sposób mogę choć trochę zmniejszyć liczbę zestawów.
(Uwaga - jeśli m = 1 jest to stosunkowo łatwe - po prostu wybierz punkty, które są bliższe (0,0,0) niż którykolwiek z pozostałych wierzchołków, z niewielkim przesunięciem na granicach. To dla m> 1 to dostaje być prawdziwym problemem)