Tôi đang giải quyết vấn đề "trộn" các tập hợp hình ảnh chồng chéo. Các bộ này có thể được biểu diễn bằng đồ thị có trọng số vô hướng như cái này:
Mỗi nút đại diện cho một hình ảnh. Hình ảnh chồng chéo được kết nối bởi một cạnh. Trọng lượng cạnh thể hiện kích thước vùng chồng lấp ( pha trộn chồng chéo lớn hơn sớm hơn dẫn đến chất lượng tổng thể tốt hơn ).
Thuật toán thường loại bỏ các cạnh. Nó có thể làm điều đó tuần tự hoặc song song. Tuy nhiên, khi trộn xảy ra, các nút hợp nhất và cấu trúc biểu đồ thay đổi. Vì vậy, song song chỉ có thể trên các thành phần được kết nối mà bản thân chúng không chồng chéo!
Các thành phần không chồng chéo như vậy là DB và FEG. Chúng ta có thể chạy song song thuật toán trộn trên các thành phần này. Kết quả là biểu đồ sau (các nút được hợp nhất được hiển thị bằng màu xanh lá cây):
Bây giờ không có khả năng song song hóa nữa bởi vì bất kỳ hai thành phần được kết nối nào đang chồng chéo (chúng có một cạnh trực tiếp giữa chúng).
Phiên bản song song của thuật toán sẽ như thế này:
1. Find connected components (no two are connected directly) and create task for each.
2. Run the tasks in parallel.
3. Update graph.
4. Until single node remains, continue with 1.
Phần khó khăn là bước đầu tiên: Làm thế nào để tìm tập hợp tốt nhất của các thành phần được kết nối?
Một cách sẽ là một thuật toán tham lam chỉ đơn giản là tìm thấy số lượng lớn nhất các thành phần tại một lần lặp nhất định. Thuật toán tham lam sẽ tối đa hóa song song ngay từ đầu nhưng với chi phí của nhiều lần lặp lại sau.
Giải pháp tối ưu có thể mang lại số lượng tốt các thành phần được kết nối trong mỗi lần lặp để tối đa hóa song song và giảm thiểu số lần lặp cùng một lúc (do đó có hai biến trong tối ưu hóa).
Tôi không thể nghĩ ra bất kỳ thuật toán tối ưu hóa nào ngoài quay lui, tức là không gian tìm kiếm của tất cả các phát triển có thể và chọn một thuật toán có độ song song tối đa.
Trọng lượng cạnh có thể bị bỏ qua, nhưng phiên bản cải tiến của thuật toán có thể tính đến nó vì các khu vực lớn hơn cần nhiều thời gian hơn để pha trộn (ví dụ: diện tích kích thước 200 sẽ mất khoảng hai lần thời gian để trộn hơn hai khu vực có kích thước 100). Cân nhắc trọng lượng có thể dẫn đến chiến lược tốt hơn trong việc lựa chọn các thành phần (thời gian chạy tổng thể nhanh hơn của thuật toán).
Bạn có bất kỳ manh mối nào cho thuật toán tối ưu hóa như vậy không, tìm ra chiến lược tốt nhất để chọn các phần của biểu đồ sao cho có sự song song tối đa và số lần lặp tối thiểu?