Я решаю проблему «смешивания» наборов перекрывающихся изображений. Эти наборы могут быть представлены неориентированным взвешенным графом, таким как этот:
Каждый узел представляет изображение. Перекрывающиеся изображения связаны ребром. Вес края представляет размер области перекрытия ( смешивание большего перекрытия быстрее приводит к улучшению общего качества ).
Алгоритм обычно удаляет ребра. Это можно сделать последовательно или параллельно. Однако, когда происходит смешивание, узлы объединяются, и структура графа изменяется. Так что распараллеливание возможно только на подключенных компонентах, которые сами не перекрываются!
Такими неперекрывающимися компонентами являются 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). Принятие во внимание весов может привести к лучшей стратегии выбора компонентов (более быстрое общее время работы алгоритма).
Есть ли у вас какие-либо подсказки для такого алгоритма оптимизации, который находит лучшую стратегию выбора частей графа, чтобы обеспечить максимальное распараллеливание и минимальное количество итераций?
Ответы:
Это очень похоже на совпадения последовательности генов при сборке генома. Глава 4 диссертации Ананта .
Параллельно вы ищете перспективные пары и поддерживаете распределенное объединение, находите структуру данных. См. Тарьян и Вишкин для их алгоритма ловушек и ярлыков для свертывания связанных компонентов.
Кроме того, вы можете попробовать последние графические методы Дебруйина для 64-битных кусочков пикселей. Я думаю, что это даст вам лучшие результаты. Чтобы помочь с проблемами квантования, я сначала уменьшил бы размер пикселей до 16 или 8 бит чёрно-белого цвета. Затем вы применяете параллельную сортировку 64-битных блоков, а затем используете их для определения границ между изображениями.
источник