Làm thế nào để phân vùng một tập hợp thành một số tập hợp rời rạc nhất định theo một số điều kiện?


11

Tôi được cung cấp một bộ A{1,,k} , một số nguyên sk và các số nguyên không âm aij . Vấn đề của tôi là tìm s tập con tách rời Sj của {1,,k} sao cho:

  1. j=1sSj=A ; và
  2. |Sj|aij cho tất cả iSjj=1,,s .

Làm thế nào để giải quyết vấn đề này? Có khó để tìm một giải pháp khả thi?

Tôi nghĩ không dễ để giải quyết vấn đề vì tôi đã thử một số quy trình bắt đầu bằng một số j{1,,n} và gán i{1,,k} cho đến khi số của i được gán cho j lớn hơn aij đối với một số i được gán. Nhưng điều này không đúng vì tôi có thể bị bỏ lại một số i không thể gán cho bất kỳ j nào j(vì aij chúng không thể thỏa mãn).

Phương pháp vũ phu, khi tôi phải tạo tất cả các tập con của A và kiểm tra từng tập con , hoạt động với tôi ( k=8,n=3 ) nhưng rất không hiệu quả.


Kiểm tra xem bản chỉnh sửa có tương ứng với câu hỏi bạn muốn hỏi không. Ngoài ra, đến từ đâu? Đó có phải là hằng số cố định (không phải là một phần của đầu vào, nhưng cố định cho mọi thời gian), hay nó là một phần của đầu vào? Cuối cùng, bạn đang tìm kiếm một giải pháp thực tế? hoặc bạn đang tìm kiếm sự phức tạp về mặt lý thuyết của vấn đề này? Nếu trước đây, bạn đã thử sử dụng lập trình tuyến tính số nguyên chưa? amax
DW

Câu trả lời:


10

Vấn đề này là NP-hard bằng cách giảm từ Vertex Cover.

Trong bài toán Vertex Cover, chúng tôi được cung cấp một biểu đồ và một số , và nhiệm vụ của chúng tôi là xác định xem có một tập hợp con trong hầu hết các đỉnh từ sao cho mọi cạnh trong đều xảy ra trên ít nhất một đỉnh trong . (Tương đương: Có thể giết mọi cạnh trong bằng cách xóa ở hầu hết các đỉnh không?)G=(V,E)rUrVEUGr

Đầu tiên, phân vùng thành tập hợp rời rạc tương đương với việc gán từng phần tử trong chính xác một trong nhãn có thể. Ý tưởng cơ bản của việc giảm là tạo nhãn cho mỗi đỉnh trong và "cho phép" mỗi cạnh chỉ được gán một trong hai nhãn tương ứng với các điểm cuối của nó, theo nghĩa sau: gán một cạnh tương ứng nhãn giới thiệu không có ràng buộc (chính hãng) nào về các cạnh khác có thể được gán cùng nhãn, trong khi việc gán một cạnh cho nhãn không tương ứng sẽ ngăn bất kỳ cạnh nào khác được gán cùng nhãn - tất nhiên có tác dụng đẩy số lên nhãn riêng biệt cần thiết.AsAsSjvjV

Để tạo một thể hiện của vấn đề của bạn từ một thể hiện của Vertex Cover:(A,a,s)(G,r)

  1. Đặt thành, Và tạo ra một yếu tố trong cho mỗi cạnh tại . (Các cặp này có thể được coi là các số nguyên ; bất kỳ mệnh đề nào giữa chúng sẽ làm.)k|E|(i,j)AvivjE1,,k
  2. Đặt thànhnếu hoặc ; mặt khác, đặt thành 1.a(b,c),d|E|d=bd=ca(b,c),d
  3. Đặt .s=r

Nếu là một ví dụ CÓ của Vertex Cover, thì thật dễ dàng để thấy rằng trường hợp vừa được xây dựng cho vấn đề của bạn cũng là một ví dụ CÓ: chỉ cần chọn các nhãn tương ứng với các đỉnh trong bất kỳ giải pháp và với mỗi cạnh chỉ định phần tử tương ứng bất kỳ một trong các nhãn hoặc đã được chọn (chọn tùy ý nếu cả hai nhãn được chọn). Giải pháp này sử dụng tập hợp con và hợp lệ vì chỉ có hiệu lực là những tập hợp tương ứng(G,r)SjvjUvbvcE(b,c)ASbScsaijnhãn, có tác dụng (không) ngăn ngừa nhiều hơncác cạnh được gán cùng một nhãn.|E|

Vẫn còn phải chỉ ra rằng một ví dụ CÓ của vấn đề của bạn ngụ ý rằng bản gốc là một ví dụ CÓ của Vertex Cover. Điều này phức tạp hơn một chút, vì nói chung , một giải pháp hợp lệ từ đến có thể gán một cạnh một nhãn không tương , tức là , có nghĩa là chúng ta không thể nhất thiết phải "đọc off" cover đỉnh có giá trị từ một giải pháp hợp lệ .X=(A,a,s)(G,r)YX(i,j)Smm{i,j}UY

Tuy nhiên, việc gán nhãn không tương ứng có chi phí cao làm hạn chế nghiêm trọng cấu trúc của giải pháp: bất cứ khi nào một cạnh được gán nhãn như vậy , với , thực tế rằng đảm bảo rằng nó phải là cạnh duy nhất được gán nhãn này. Vì vậy, trong bất kỳ giải pháp chứa cạnh không có nhãn tương ứng , chúng tôi có thể xây dựng một giải pháp thay thế như sau:(i,j)Smm{i,j}a(i,j),m=1Y(i,j)SmY

  1. Tự ý chọn nhãn mới cho là hoặc .Sz(i,j)SiSj
  2. Gán nhãn mới này. Nếu điều này dẫn đến một giải pháp không hợp lệ, thì đó phải là vì chính xác một cạnh khác , đã được gán nhãn . Trong trường hợp đó, đặt và chuyển sang bước 1.(i,j)(i,j)z{i,j}Sz(i,j)=(i,j)

Thuật toán trên phải chấm dứt theo một trong hai cách: hoặc tìm thấy nhãn mới không gây mâu thuẫn hoặc tìm thấy một chu kỳ đỉnh hoàn chỉnh. Trong trường hợp trước, một giải pháp mới hợp lệ với được tìm thấy, trong trường hợp sau, một giải pháp mới hợp lệ với bộ được tìm thấy; dù bằng cách nào, chúng tôi đã xây dựng một giải pháp mới hợp lệ với ít nhất một cạnh nữa được gán cho một nhãn tương ứng . Sau khi lặp lại toàn bộ quá trình này nhiều nhấtnhiều lần, chúng tôi sẽ tạo ra một giải pháp hợp lệ từ đó thể đọc được giải pháp cho vấn đề Vertex Cover ban đầu .Szs1s|E|Y

Cấu trúc này rõ ràng là thời gian đa thức, do đó, vấn đề của bạn là NP-hard.


Cảm ơn sự giúp đỡ của bạn. Bạn có biết làm thế nào một người có thể giải quyết (gần đúng) vấn đề này không? (Ví dụ như tôi có thể sử dụng các kỹ thuật cho bài toán che đỉnh để giải quyết nó không?) Tôi đã thử một số cách tiếp cận tham lam nhưng đôi khi, nó không thể đưa ra một giải pháp khả thi. (Cách tôi chọn làm cho cách tiếp cận tham lam thất bại khi giải pháp có thể tồn tại.)Sj
drzbir

Chà, đôi khi dự đoán rằng một cách tiếp cận tham lam đôi khi sẽ không đưa ra được một giải pháp khả thi, vì nếu luôn như vậy, bạn sẽ giải quyết một vấn đề NP-hard trong đa thời gian ;-) Hãy nhớ rằng nó không nhất thiết sai nếu không thể tìm một giải pháp: có thể không có giải pháp khả thi nào tồn tại.
j_random_hacker

Về kỹ thuật giải pháp, một cái mà tôi thích được gọi là tìm kiếm chùm tia. Về cơ bản, đây là một loại liên kết chi nhánh và "quên" các giải pháp bộ phận đủ xấu để hạn chế việc sử dụng bộ nhớ của nó. (B & B tự nó là một cách tiếp cận rất tốt, và đôi khi giải quyết vấn đề nhanh chóng, và nó đơn giản hơn một chút so với tìm kiếm chùm tia nên đáng để thử - nhưng vì đó là một phương pháp chính xác, nên dĩ nhiên có thể mất hàng thiên niên kỷ.)
j_random_hacker

(Tất cả những điều dưới đây cũng áp dụng cho tìm kiếm chùm tia cũng như B & B.) B & B là một kỹ thuật rất chung chung. Điều quan trọng với nó là khai thác các chi tiết cụ thể của vấn đề để tổ chức các quyết định bạn đưa ra sao cho càng nhiều càng tốt, các quyết định tồi tệ (nghĩa là các quyết định không dẫn đến các giải pháp khả thi) được đưa ra sớm trong cây tìm kiếm. (Những quyết định này sẽ được đưa ra ở đâu đó , và mỗi cấp độ sâu hơn mà chúng được đưa ra sẽ nhân đôi số lần chúng được đưa ra.) Đối với vấn đề của bạn, tôi sẽ đề nghị xếp hạng các yếu tố theo thứ tự theo thứ tự "xấu", ở đâu. ..A
j_random_hacker

... Điểm xấu của yếu tố có thể là, ví dụ, mức tối thiểu của trên tất cả , phá vỡ các mối quan hệ theo mức tối thiểu thứ hai, sau đó là tối thiểu thứ ba, v.v. Nói một cách đơn giản, yếu tố "tệ nhất" sẽ là yếu tố mà hầu hết ràng buộc bất kỳ tập hợp nào mà nó được thêm vào. Tại mỗi nút ở độ sâu trong cây tìm kiếm, bạn sẽ có một giải pháp một phần trong đó các phần tử đầu tiên (và do đó "tệ nhất") đã được gán cho các tập hợp; bạn sẽ cần chọn bộ nào trong số để gán phần tử cho: đó là, bạn sẽ cần tối đa cuộc gọi đệ quy. ("Lên đến" vì hy vọng chúng ta có, ...iaijjddn(d+1)n
j_random_hacker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.