Tôi đang thực hiện một thuật toán sẽ khá phức tạp về mặt tính toán và muốn thử đảm bảo rằng tôi không làm những việc không cần thiết.
Có một mạng tinh thể nxnxn, ví dụ: nếu n = 2, nó bao gồm (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1).
Từ mạng này tôi sẽ tạo đệ quy tất cả các tập hợp điểm m, đại loại như:
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);
}
Điều này sau đó có thể được gọi bắt đầu với một set_of_point trống.
Bản chất của vấn đề là tôi thực sự không cần mọi hoán vị của điểm m, chỉ là những điểm duy nhất dưới các đối xứng tự nhiên của khối lập phương.
Ví dụ: lấy khối lập phương 2x2x2 và giả sử chúng ta muốn tất cả các bộ 1 điểm. Theo thuật toán cơ bản ở trên, có 8 bộ 1 điểm khác nhau.
Tuy nhiên, bằng cách sử dụng các đối xứng của khối lập phương, chúng ta có thể giảm xuống 1 bộ duy nhất 1 điểm, vì tất cả 8 điểm ban đầu đều tương đương theo các đối xứng của khối (trong trường hợp này đều là 'góc').
Nếu khối lập phương là 2x2x2 và m = 2, có 28 bộ trong thuật toán cơ bản, nhưng điều này giảm xuống chỉ còn 3 theo đối xứng (ví dụ: {(0,0,0), (1,0,0)}, {(0 , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})
Rõ ràng việc thực hiện tính toán trên 3 bộ điểm tốt hơn nhiều so với 28, vì vậy câu hỏi của tôi là làm thế nào để tôi không tạo ra các điểm tương đương đối xứng với một tập hợp đã được tạo? Hoặc nếu điều này là không thể, ít nhất tôi có thể giảm số lượng bộ một chút.
(Lưu ý - nếu m = 1 thì điều này tương đối dễ dàng - chỉ cần chọn các điểm gần (0,0,0) hơn bất kỳ đỉnh nào khác, với một chút sai lệch ở các ranh giới. Đó là cho m> 1 rằng điều này sẽ đạt được là một vấn đề thực sự)