2009-08-21 11 views
8

Tôi có một bộ N^2 số và N thùng. Mỗi thùng được cho là có số N từ tập hợp được gán cho nó. Vấn đề tôi đang phải đối mặt là tìm một bộ phân phối ánh xạ các con số tới các thùng, thỏa mãn ràng buộc, rằng mỗi cặp số có thể chia sẻ cùng một thùng chỉ một lần.Tìm một bộ hoán vị, với một ràng buộc

Phân phối có thể được biểu diễn độc đáo bằng ma trận NxN, trong đó mỗi hàng đại diện cho một thùng. Sau đó, vấn đề là tìm một tập hợp các hoán vị của các phần tử ma trận, trong đó mỗi cặp số chỉ chia sẻ cùng một hàng một lần. Nó không liên quan đến hàng nào, chỉ có hai số được gán cho cùng một số.

Ví dụ bộ 3 hoán vị đáp ứng các hạn chế đối với N = 8:

 
0 1 2 3 4 5 6 7 
8 9 10 11 12 13 14 15 
16 17 18 19 20 21 22 23 
24 25 26 27 28 29 30 31 
32 33 34 35 36 37 38 39 
40 41 42 43 44 45 46 47 
48 49 50 51 52 53 54 55 
56 57 58 59 60 61 62 63 
 
0 8 16 24 32 40 48 56 
1 9 17 25 33 41 49 57 
2 10 18 26 34 42 50 58 
3 11 19 27 35 43 51 59 
4 12 20 28 36 44 52 60 
5 13 21 29 37 45 53 61 
6 14 22 30 38 46 54 62 
7 15 23 31 39 47 55 63 
 
0 9 18 27 36 45 54 63 
1 10 19 28 37 46 55 56 
2 11 20 29 38 47 48 57 
3 12 21 30 39 40 49 58 
4 13 22 31 32 41 50 59 
5 14 23 24 33 42 51 60 
6 15 16 25 34 43 52 61 
7 8 17 26 35 44 53 62 

Một hoán vị mà không thuộc vào bộ nói trên:

 
0 10 20 30 32 42 52 62 
1 11 21 31 33 43 53 63 
2 12 22 24 34 44 54 56 
3 13 23 25 35 45 55 57 
4 14 16 26 36 46 48 58 
5 15 17 27 37 47 49 59 
6 8 18 28 38 40 50 60 
7 9 19 29 39 41 51 61 

Vì của nhiều va chạm với hoán vị thứ hai, vì, ví dụ chúng đều ghép nối các số 0 và 32 trong một hàng.


Đếm ba là dễ dàng, nó bao gồm 1 hoán vị tùy ý, chuyển vị của nó và ma trận nơi các hàng được tạo từ các đường chéo của ma trận trước đó.

Tôi không thể tìm cách tạo ra một bộ bao gồm nhiều hơn. Nó có vẻ là một vấn đề rất phức tạp, hoặc một vấn đề đơn giản với một giải pháp không rõ ràng. Dù bằng cách nào tôi cũng sẽ biết ơn nếu ai đó có ý tưởng làm thế nào để giải quyết nó trong thời gian hợp lý cho trường hợp N = 8, hoặc xác định đúng tên học tập của vấn đề, vì vậy tôi có thể google cho nó.

Trong trường hợp bạn đang tự hỏi điều gì là hữu ích cho, tôi đang tìm một thuật toán lập lịch trình cho một công tắc ngang với 8 bộ đệm, phục vụ lưu lượng truy cập đến 64 điểm đến. Phần này của thuật toán lập lịch là đầu vào giao thông bất khả tri, và chuyển mạch theo chu kỳ giữa một số ánh xạ vùng đệm đích. Mục tiêu là để mỗi cặp địa chỉ đích cạnh tranh cho cùng một bộ đệm chỉ một lần trong chu kỳ đạp xe và để tối đa hóa độ dài của khoảng thời gian đó. Nói cách khác, để mỗi cặp địa chỉ đang cạnh tranh cho cùng một bộ đệm càng ít càng tốt.


EDIT:

Dưới đây là một số mã tôi có. CODE

Nó tham lam, nó thường chấm dứt sau khi tìm thấy hoán vị thứ ba. Nhưng nên tồn tại một tập hợp ít nhất N hoán vị thỏa mãn vấn đề.

Phương án thay thế sẽ yêu cầu chọn hoán vị tôi liên quan tìm kiếm hoán vị (I + 1..N), để kiểm tra nếu hoán vị tôi là một phần của giải pháp bao gồm số hoán vị tối đa. Điều đó đòi hỏi phải liệt kê tất cả các hoán vị để kiểm tra ở mỗi bước, điều này cực kỳ tốn kém.

+0

Toàn bộ câu hỏi là một dài dòng chút. Nó không rõ ràng những gì bạn có ý nghĩa của cặp. Bạn có ý nghĩa gì bởi 'ràng buộc, rằng mỗi cặp số chỉ có thể chia sẻ cùng một thùng một lần.'? – Alex

+0

Tôi đang gặp sự cố khi hiểu ràng buộc của bạn "mỗi cặp số chỉ có thể chia sẻ cùng một thùng một lần". Điều này có thực sự không đáng kể với bất kỳ sự sắp xếp nào của N^2 số duy nhất không? Bạn có thể cho thấy một sự sắp xếp mà không bị ràng buộc? –

+0

Hạn chế cần phải được thỏa mãn cho toàn bộ các hoán vị. Vì vậy, nếu một hoán vị đặt các số 1 và 2 trên cùng một hàng, thì không có hoán vị nào khác trong tập hợp được phép đặt 1 và 2 trên cùng một hàng nữa. –

Trả lời

4

gì bạn muốn là combinatorial block design. Sử dụng danh pháp trên trang được liên kết, bạn muốn thiết kế kích thước (n^2, n, 1) cho tối đa k. Điều này sẽ cho bạn n (n + 1) hoán vị, sử dụng danh pháp của bạn. Đây là lý thuyết tối đa có thể có được bởi một đối số đếm (xem phần giải thích trong bài viết về đạo hàm của b từ v, k và lambda). Các thiết kế như vậy tồn tại cho n = p^k đối với một số số nguyên tố p và nguyên k, sử dụng mặt phẳng afin. Người ta phỏng đoán rằng những chiếc máy bay duy nhất có thể có kích thước này. Do đó, nếu bạn có thể chọn n, có thể câu trả lời này sẽ đủ.

Tuy nhiên, nếu thay vì số lượng hoán vị tối đa về mặt lý thuyết, bạn chỉ muốn tìm số lớn (số lượng lớn nhất bạn có thể cho n^2), tôi không chắc nghiên cứu về các đối tượng này được gọi là gì .

+0

Nhiều, rất cám ơn! Trên trang wikipedia cho thiết kế khối Tôi tìm thấy một liên kết đến một cơ sở dữ liệu chứa (64, 8, 1) giải pháp tôi đã quan tâm. –

4

Tạo một mảng 64 x 64 x 8: bool bị cấm [i] [j] [k] cho biết liệu cặp (i, j) có xuất hiện trong hàng k hay không. Mỗi lần bạn sử dụng cặp (i, j) trong hàng k, bạn sẽ đặt giá trị được liên kết trong mảng này thành một. Lưu ý rằng bạn sẽ chỉ sử dụng một nửa mảng này, trong đó i < j.

Để tạo một hoán vị mới, hãy bắt đầu bằng cách thử thành viên 0 và xác minh rằng ít nhất bảy số bị cấm [0] [j] [0] không được đặt. Nếu không có bảy trái, tăng và thử lại. Lặp lại để điền vào phần còn lại của hàng. Lặp lại toàn bộ quá trình này để lấp đầy toàn bộ hoán vị NxN.

Có lẽ các tối ưu hóa bạn có thể đưa ra khi bạn triển khai thực hiện điều này, nhưng điều này sẽ hoạt động khá tốt.

+0

+1, nhưng tôi nghĩ ràng buộc này mạnh hơn: một khi một cặp đã xuất hiện trong cùng một hàng, chúng không thể xuất hiện cùng nhau trong hàng * bất kỳ * trong một hoán vị khác. Vì vậy, có lẽ mảng "cấm" phải là 64x64, không có thứ nguyên cuối cùng? –

+0

Cách tiếp cận tham lam như thế này chỉ tạo ra một số lượng hoán vị nhỏ trước khi kết thúc. Đó là điều đầu tiên tôi thử. –

1

Có thể bạn có thể cải tổ vấn đề của mình thành lý thuyết đồ thị. Ví dụ, bạn bắt đầu với đồ thị hoàn chỉnh với các đỉnh N × N. Tại mỗi bước, bạn phân chia đồ thị thành N N-cliques, và sau đó loại bỏ tất cả các cạnh được sử dụng.

Đối với N = 8 trường hợp này, K64 có 64 × 63/2 = 2016 cạnh, và sáu mươi tư rất nhiều K8 có 1792 cạnh, vì vậy vấn đề của bạn có thể không là không thể :-)

+0

Điều đó nghe có vẻ chính xác! Và sâu sắc - bởi vì vấn đề tìm kiếm clique được biết là NP-complete nói chung. Những gì tôi nghi ngờ là vài lần lặp đầu tiên (trong khi đồ thị NxN vẫn còn tương đối dày đặc) có thể dễ dàng tìm thấy bằng sức mạnh vũ phu, nhưng khi các cạnh được loại bỏ, các hàng dài mất nhiều thời gian hơn để tìm. –

+0

Vâng, việc tìm kiếm _maximal_ cliques là NP-complete. Tôi không chắc về vấn đề này. Tôi nghĩ rằng các cliques sẽ dễ dàng tìm thấy nếu chúng tồn tại, vì mỗi đỉnh phải là thành viên của một, và bạn chỉ quan tâm đến kích thước N. Vấn đề là một thuật toán tham lam có lẽ sẽ chọn các cliques sai và không thể để tìm tất cả N, giả sử N tồn tại (tốt, đó là cảm giác ruột của tôi anyway). –

+0

Vâng, về cơ bản những gì tôi đã thực hiện là tìm tất cả 8-cliques. Điều này là nhanh chóng có 2 hoán vị bắt đầu (40320 8-cliques tìm thấy), và doable có 1 hoán vị bắt đầu (16.000.000 8-cliques tìm thấy). Vấn đề mặc dù: 1. Liệt kê tất cả các hoán vị pháp lý, đó là bộ 8 8-cliques, là 40320^8 hoặc (16 triệu)^8 vụ. 2. Số lượng 8-cliques và hoán vị có thể trong bước tiếp theo phụ thuộc vào sự lựa chọn hoán vị trong bước này, tham lam thực sự không hoạt động. Một tìm kiếm hoàn chỉnh sẽ cần, trong khi tìm kiếm hoán vị I, đánh giá tất cả các hoán vị sau này (I + 1..N):/ –

0

Phải, kiểu tham lam không hoạt động vì bạn hết số.

Thật dễ dàng để thấy rằng không thể có nhiều hơn 63 hoán vị trước khi bạn vi phạm ràng buộc. Vào ngày 64, bạn sẽ phải ghép nối ít nhất một trong các số với số khác của nó đã được ghép nối với. Nguyên tắc pigeonhole.

Thực tế, nếu bạn sử dụng bảng các cặp bị cấm tôi đã đề xuất trước đó, bạn thấy rằng chỉ có tối đa N + 1 = 9 hoán vị có thể trước khi bạn hết. Bảng có N^2 x (N^2-1)/2 = hạn chế không dự phòng năm 2016, và mỗi hoán vị mới sẽ tạo N x (N chọn 2) = 28 cặp mới. Vì vậy, tất cả các cặp sẽ được sử dụng hết sau 2016/28 = 9 hoán vị. Nó có vẻ như nhận ra rằng có rất ít hoán vị là chìa khóa để giải quyết vấn đề.

Bạn có thể tạo một danh sách các N hoán vị số n = 0 ... N-1 như

A_ij = (i * N + j + j * n * N) mod N^2 

mà tạo ra một hoán vị mới bằng cách chuyển các cột trong mỗi hoán vị. Hàng đầu của hoán vị thứ n là các đường chéo của hoán vị n-1. EDIT: Rất tiếc ... điều này chỉ xuất hiện khi làm việc khi N là số nguyên tố.

này bỏ sót một hoán vị cuối cùng mà bạn có thể nhận được bằng transposing ma trận:

A_ij = j * N + i 
+0

Bạn cũng nhận được giới hạn trên 'N + 1' bằng cách kiểm tra các hàng xóm N-1 một giá trị đã cho, ví dụ 1. Mỗi số N^2-1 còn lại chỉ có thể xuất hiện một lần trong một hàng với 1, có nghĩa là có nhiều nhất (N^2-1)/(N-1) = N + 1 hàng duy nhất, do đó ma trận, chứa 1. – outis