Я вирішую проблему "змішування" наборів зображень, що перекриваються. Ці множини можуть бути представлені непрямим зваженим графіком, таким як цей:
Кожен вузол представляє зображення. Зображення, що перекриваються, з'єднуються краєм. Вага краю представляє розмір площі перекриття ( змішування великого перекриття швидше призводить до покращення загальної якості ).
Алгоритм зазвичай видаляє краї. Це можна робити послідовно або паралельно. Однак, коли відбувається змішування, вузли зливаються і структура графіку змінюється. Тож паралелізація можлива лише на підключених компонентах, які самі по собі не перетинаються!
Такими компонентами, що не перекриваються, є DB та FEG. Ми можемо безпечно паралельно запускати алгоритм змішування цих компонентів. Результатом є такий графік (об'єднані вузли відображаються зеленим кольором):
Тепер не можлива подальша паралелізація, оскільки будь-які два з'єднані компоненти перекриваються (вони мають край безпосередньо між ними).
Паралельна версія алгоритму виглядатиме так:
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.
Хитра частина - це перший крок: Як знайти найкращий набір підключених компонентів?
Одним із способів був би жадібний алгоритм, який просто знаходить найбільшу кількість компонентів за заданою ітерацією. Жадібний алгоритм максимізує паралелізацію на початку, але ціною багатьох повторень пізніше.
Оптимальним рішенням може бути отримання великої кількості підключених компонентів у кожній ітерації для максимальної паралелізації та мінімізації кількості ітерацій одночасно (тому в оптимізації є дві змінні).
Я не можу придумати жоден алгоритм оптимізації, окрім зворотного відстеження, тобто простір пошуку всіх можливих еволюцій і вибрати той, з максимальною паралелізацією.
Ваги краю можна ігнорувати, але вдосконалена версія алгоритму може врахувати його, оскільки для змішування більших площ потрібен більше часу (наприклад, площа розміром 200 займе приблизно в два рази більше часу, ніж дві області розміром 100). Врахування ваги може призвести до кращої стратегії вибору компонентів (більш швидкий загальний час роботи алгоритму).
Чи є у вас підказки для такого алгоритму оптимізації, який знаходить найкращу стратегію вибору частин графіка, щоб була максимальна паралелізація та мінімальна кількість ітерацій?