Cho một tập hợp các tập hợp, tìm (các) tập hợp nhỏ nhất chứa ít nhất một phần tử từ mỗi tập hợp


15

Cho một tập bộ, tôi muốn tìm một bộ như vậy mà mỗi bộ trong chứa ít nhất một yếu tố của . Tôi cũng muốn chứa càng ít phần tử càng tốt trong khi vẫn đáp ứng tiêu chí này, mặc dù có thể tồn tại nhiều hơn một nhỏ nhất với thuộc tính này (giải pháp không nhất thiết phải là duy nhất).SMSSMMM

Ví dụ cụ thể, giả sử tập hợp là tập hợp các quốc kỳ và với mỗi cờ trong , các phần tử là màu được sử dụng trong quốc kỳ đó. Hoa Kỳ sẽ có và Ma-rốc sẽ có . Sau đó sẽ là một tập hợp các màu sắc với tài sản mà mỗi quốc gia sử dụng cờ ít nhất một trong những màu sắc trong . ( Các màu Olympic , xanh dương, đen, đỏ, xanh lá cây, vàng và trắng là một ví dụ về như vậy , hoặc ít nhất là vào năm 1920.)SSSS={red,white,blue}S={red,green}MMM

Có một tên chung cho vấn đề này? Có một thuật toán tốt nhất được chấp nhận của Wikipedia để tìm tập không? (Tôi quan tâm đến chính giải pháp hơn là tối ưu hóa quy trình cho độ phức tạp tính toán.)M


2
Bạn có thể tìm kiếm các vấn đề bao gồm thiết lập ?
Juho

@Juho Không hẳn. Trong ví dụ của tôi, vấn đề bao trùm sẽ là tìm một tập hợp các cờ sao cho sự kết hợp của các cờ đó chứa tất cả các màu được sử dụng trên tất cả các cờ. Ngược lại, tôi đang tìm kiếm thứ gì đó sẽ nhổ ra một danh sách các màu chứ không phải danh sách các cờ và tôi không cần bộ để chứa mọi màu có thể. Tôi sẽ chọc quanh khu vực này trên Wikipedia, tôi nghĩ rằng bạn đã đưa tôi đi đúng hướng. Cảm ơn! M
bdesham

Câu trả lời:


13

Vấn đề là vấn đề NP-Complete nổi tiếng NPing Set . Nó liên quan chặt chẽ với Set-Cover . Bằng chứng NP-đầy đủ có thể được tìm thấy trong cuốn sách kinh điển của Garey và Johnson .

Nếu bạn muốn ước tính nó, trước tiên bạn có thể dịch ví dụ của bạn sang Set-Cover, sau đó áp dụng thuật toán xấp xỉ cho Set-Cover. Tuy nhiên, Set-Cover không thể được xấp xỉ bởi một yếu tố không đổi trong thời gian đa thức, trừ khi P = NP như được hiển thị bởi Lund và Yannakakis .

Nếu bạn quan tâm đến các giải pháp chính xác và đầu vào của bạn hoạt động tốt, tôi khuyên bạn nên sử dụng một bộ điều khiển tham số cố định . Thời gian chạy ở đây không chỉ được thể hiện dưới dạng độ dài đầu vào n mà còn dưới dạng tham số bổ sung k . Nếu thời gian chạy là O(f(k)nO(1)) , chúng ta gọi là thuật toán một FPT-thuật toán. Ở đây, f(k) là một hàm tăng. Vì vậy, nếu k là hằng số, chúng ta có một thuật toán polytime. Chương đầu tiên củacuốn sách của Flum và Grohe , giải thích một thuật toán của FPT cho bộ hit (chính xác hơn là cho bộ p -card-hit). Thuật toán dễ thực hiện và sử dụng phương pháp cây tìm kiếm giới hạn. Tuy nhiên, nó cần nhiều không gian để giải thích ở đây, về cơ bản, bạn chia nhỏ tìm kiếm vũ lực cần thiết (?), Thành các phần nhỏ (khi k nhỏ).


Cảm ơn. Bạn có thể cung cấp một tài liệu tham khảo cho một nơi nào đó để đọc về việc triển khai thực tế? Tức là tôi sẽ dịch vấn đề của mình sang vấn đề bao trùm, và sau đó tôi sẽ giải quyết vấn đề đó như thế nào?
bdesham

1
bdesham, hãy nghĩ về mỗi yếu tố như tập hợp các tập hợp mà nó thuộc về. chạy bộ bìa trên đầu vào phần tử như bộ. Ngoài ra, đọc trang wiki được liên kết ở đây.
Sasho Nikolov

Bạn có quan tâm đến một giải pháp gần đúng, hoặc bạn muốn có giải pháp chính xác?
A.Schulz

Tôi muốn một giải pháp chính xác. Các bộ dữ liệu tôi đang làm việc đủ nhỏ để tôi không nghĩ đó là một vấn đề.
bdesham

1
@Keyser: Bạn nói đúng. Tuy nhiên, thông thường có liên quan đến vấn đề quyết định với vấn đề tối ưu hóa tương ứng vì chúng là các vấn đề hoàn thành NP liên quan chặt chẽ.
A.Schulz

2

Một ý tưởng có thể giúp: nếu giao điểm của tất cả các tập hợp trong không trống, thì bạn có thể chọn bất kỳ phần tử s nào trong giao lộ và đặt M = { s } . Nếu giao điểm trống, hãy tìm một phần tử (màu) c có sự xuất hiện trong các tập hợp là tối đa và thay thế tất cả các tập hợp mà nó xuất hiện bởi singleton { c } . Tiếp tục làm điều này cho đến khi số lần xuất hiện của mỗi phần tử bằng 1 và sau đó đặt M thành tập hợp của các tập hợp còn lại. Ví dụ: nếu S là tập hợp sức mạnh của một số tập hợp A thì M = ASsM={s}c{c}1MSAM=A. Tôi có thể sai tuy nhiên.


2

Hãy xem "Lý thuyết chẩn đoán từ các nguyên tắc đầu tiên" của Ray Reiter , nơi ông đưa ra một thuật toán để tính toán các bộ nhấn và ghi chú bổ sung này "Một sự điều chỉnh ..." .

Thuật toán thường được gọi là thuật toán "hit set tree", không quá khó để tìm ra cách triển khai. Bạn đã đề cập rằng bạn không quá quan tâm đến thời gian chạy, nhưng các tối ưu hóa như chấm dứt chi nhánh sớm, v.v ... khá quan trọng đối với việc triển khai và cũng rất thú vị :)


2
Bạn có thể tóm tắt thuật toán để làm cho câu trả lời của bạn khép kín hơn không? Liên kết có thể và sẽ phá vỡ.
Juho

0

Thực tế mà nói, một trong những cách tốt hơn (chắc chắn là một trong những cách dễ nhất) để giải quyết các trường hợp của Set Cover / Hits Set là lập trình số nguyên hỗn hợp. Điều này liên quan đến việc truyền đạt công thức lập trình số nguyên cho người giải quyết bạn chọn.

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.