Saya menerapkan algoritma yang akan menjadi sangat kompleks secara komputasi, dan ingin mencoba memastikan saya tidak melakukan pekerjaan yang tidak perlu.
Ada kisi kubik nxnxn, misalnya jika n = 2 ini terdiri dari (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1).
Dari kisi ini saya akan secara rekursif menghasilkan semua set poin m, sesuatu seperti:
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);
}
Ini kemudian dapat disebut dimulai dengan set_of_points kosong.
Sifat masalah adalah sedemikian rupa sehingga saya tidak benar-benar membutuhkan setiap permutasi poin m, hanya yang unik di bawah simetri alami kubus.
Misalnya, ambil kubus 2x2x2 dan anggap kita ingin semua set 1 poin. Di bawah algoritma dasar di atas, ada 8 set 1 poin yang berbeda.
Namun, dengan menggunakan simetri kubus kita dapat mengurangi ini ke 1 set unik 1 poin, karena semua 8 asli setara dengan simetri kubus (mereka semua 'sudut' dalam kasus ini).
Jika kubusnya 2x2x2 dan m = 2, ada 28 set dalam algoritma dasar, tetapi ini berkurang menjadi hanya 3 di bawah simetri (misalnya {(0,0,0), (1,0,0)}, {(0 , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Jelas melakukan perhitungan pada 3 set poin jauh lebih baik dari 28, jadi pertanyaan saya adalah bagaimana saya tidak menghasilkan set poin yang secara simetris sama dengan set yang sudah dihasilkan? Atau jika ini tidak memungkinkan, bagaimana saya setidaknya mengurangi jumlah set sedikit.
(Catatan - jika m = 1 ini relatif mudah - cukup pilih titik yang lebih dekat (0,0,0) daripada simpul lainnya, dengan sedikit fudging pada batas-batasnya. Untuk m> 1 ini didapat menjadi masalah nyata)