Những gì tôi muốn làm là chia một nhóm (n) Các thành các nhóm kích thước bằng nhau (nhóm kích thước m, và vì đơn giản giả định rằng không có thức ăn thừa, tức là n là chia hết cho bởi m). Làm điều này nhiều lần, tôi muốn đảm bảo rằng không có cặp mục nào trong cùng một nhóm với nhau hai lần.Làm thế nào để (hiệu quả) tạo ra các bộ phân tách trong khi sử dụng các cặp phần tử chỉ một lần?
Để làm cho bê tông nhẹ hơn này, để xây dựng nhóm của hai trong số sáu mục A..F
, một khi có thể phân vùng tập gấp năm lần theo những cách khác nhau:
(A, B)
,(C, D)
,(E, F)
(A, C)
,(B, E)
,(D, F)
(A, D)
,(B, F)
,(C, E)
(A, E)
,(B, D)
,(C, F)
(A, F)
,(B, C)
,(D, E)
Tập cùng các mặt hàng có thể được phân chia một lần duy nhất vào nhóm của ba mà không cặp chồng chéo:
(A, B, C)
,(D, E, F)
(Như @DavidHam người đàn ông chỉ ra dưới đây, có nhiều cách khác nhau để tạo phân vùng trong ví dụ này. Tuy nhiên, khi đã tạo phân vùng một lần, không bao giờ có một phân vùng thứ hai nào tách tất cả các cặp. Đó là tốt - ứng dụng của tôi không cần phải tạo ra tất cả có thể cách phân vùng bộ trên toàn thế giới, một cuộc họp giải pháp những hạn chế sẽ làm)
Câu hỏi của tôi, bây giờ, là thế này: Có một cách làm điều này hiệu quả? Có thủ thuật nào để tăng tốc độ tạo ra các bộ này không?
Vì vậy, đến nay, tôi đã xử lý vấn đề này như là một vấn đề exact cover và giải quyết nó bằng backtracking algorithm (một biến thể của DLX). Điều này làm việc rất tốt cho các cặp, nhưng khi các nhóm trở nên lớn hơn số lượng các khả năng thuật toán phải xem xét phát nổ, và xử lý trở nên rất khó sử dụng.
Điều tôi đang tìm kiếm là các mẹo để tăng tốc mọi thứ lên. Bất cứ ý tưởng là rất đáng hoan nghênh, đặc biệt (nhưng không giới hạn):
- tối ưu hóa và chẩn đoán để giảm số lượng các khả năng mà cần phải được xem xét trước khi giải quyết (ví dụ, nó là rõ ràng từ các ví dụ ở trên, việc phân chia đầu tiên có thể được thực hiện đơn giản tùy ý, và tập đầu tiên của mỗi phân vùng [cột đầu tiên ở trên] có thể được tạo tự động).
- Có các biến thể của backtracking có thể đối phó với số lượng lớn các ứng cử viên? (ví dụ: không cần phải tạo mọi khả năng trước)
- Các thuật toán khác , phương pháp tiếp cận hoặc khái niệm toán học mà tôi nên xem xét?
Bất kỳ ý tưởng và đề xuất nào đều được hoan nghênh. Cảm ơn bạn rất nhiều vì đã cân nhắc điều này!
Cập nhật
Ok, vì vậy đây đã được một thời gian, nhưng tôi đã dành nhiều thời gian hơn về vấn đề này và muốn lấy lại cho bạn. @ david-eisenstat đặt tôi vào đúng con đường bằng cách cho tôi cụm từ tìm kiếm chính xác (cảm ơn bạn rất nhiều!) - Tôi đã đọc khá một chút về vấn đề Golfer xã hội.
Một trong những nguồn tài nguyên tốt nhất mà tôi tìm thấy, là tác phẩm của Markus Triska, người thảo luận về một số phương pháp tiếp cận (và sau đó tiếp tục trình bày thuật toán rất hay) trong luận án của mình. Điều này là rất khuyến khích nếu bất cứ ai chạy vào một vấn đề tương tự!
Re * Cùng một tập hợp các mục có thể được phân chia chỉ một lần thành các nhóm ba mà không có cặp chồng chéo *: Có gì sai với '((ABD), (CEF))' và '((ABE) (CDF)) ', và ít nhất sáu hơn? Câu hỏi như đã nêu không chỉ rõ lý do bạn loại trừ các kết hợp đó. –
@DavidHammen cặp A B xuất hiện ở cùng một nhóm trong cả hai phân vùng. Trong câu hỏi của OP nó nói rằng * không có cặp mục trong cùng một nhóm với nhau hai lần * –
Cảm ơn rất nhiều, hai bạn! @ DavidHammen: Bạn hoàn toàn chính xác trong đó tôi có thể đã sử dụng bất kỳ ví dụ của bạn thay vì một trong những tôi đã đưa ra. Tôi sẽ làm rõ điều này trong câu hỏi. – mezzopiano