Oldukça hesaplama açısından karmaşık olacak bir algoritma uyguluyorum ve gereksiz iş yapmadığımdan emin olmak istiyorum.
Bir nxnxn kübik kafes vardır, örneğin n = 2 ise bu (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1).
Bu kafesden, m noktalarının tüm setlerini tekrar tekrar üreteceğim, şöyle bir şey:
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);
}
Bu daha sonra boş bir set_of_points ile başlayarak çağrılabilir.
Sorunun doğası öyle ki aslında m noktalarının her permütasyonuna ihtiyacım yok , sadece küpün doğal simetrileri altında benzersiz olanlara.
Örneğin, 2x2x2'lik bir küp alın ve tüm 1 nokta setlerini istediğimizi varsayalım. Yukarıdaki temel algoritma altında 8 farklı 1 nokta seti vardır.
Bununla birlikte, küpün simetrilerini kullanarak bunu 1 benzersiz 1 nokta setine indirebiliriz, çünkü orijinal 8'in tamamı küpün simetrileri altında eşdeğerdir (hepsi bu durumda 'köşelerdir').
Küp 2x2x2 ve m = 2 ise, temel algoritmada 28 set vardır, ancak bu simetri altında sadece 3'e düşer (örn. {(0,0,0), (1,0,0)}, {(0) , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Açıkçası 3 nokta kümesinde hesaplama yapmak 28'den çok daha iyidir, bu yüzden sorum şu anda oluşturulmuş bir kümeye simetrik olarak eşdeğer nokta kümeleri oluşturmamaya nasıl devam edebilirim? Veya bu mümkün değilse, en azından set sayısını nasıl biraz azaltabilirim.
(Not - m = 1 ise bu nispeten kolaydır - sadece diğer köşelerden daha yakın olan noktaları (0,0,0) seçin, sınırlarda biraz fuding yapın. gerçek bir sorun olmak için)