Jump to content

Параллельный алгоритм поиска кратчайшего пути для всех пар

Центральной проблемой алгоритмической теории графов является задача о кратчайшем пути . Таким образом, проблема поиска кратчайшего пути между каждой парой узлов известна как проблема всех пар кратчайших путей (APSP) . Поскольку последовательные алгоритмы для решения этой задачи часто обеспечивают длительное время выполнения, распараллеливание оказалось полезным в этой области. В этой статье представлены два эффективных алгоритма, решающих эту проблему.

Другой вариант проблемы — это задача о кратчайших путях с одним источником (SSSP), которая также имеет параллельные подходы: Параллельный алгоритм кратчайшего пути с одним источником .

Определение проблемы

[ редактировать ]

Позволять быть ориентированным графом с набором узлов и набор ребер . Каждое ребро имеет вес назначенный. Цель задачи поиска кратчайших путей для всех пар — найти кратчайший путь между всеми парами узлов графа. Чтобы этот путь был уникальным, необходимо, чтобы в графе не было циклов с отрицательным весом.

В оставшейся части статьи предполагается, что граф представлен с помощью матрицы смежности . Мы ожидаем, что результатом алгоритма будет матрица расстояний. . В , каждая запись вес кратчайшего пути в из узла узел .

Алгоритм Флойда , представленный позже, может обрабатывать отрицательные веса ребер, тогда как алгоритм Дейкстры требует, чтобы все ребра имели положительный вес.

Алгоритм Дейкстры

[ редактировать ]

Алгоритм Дейкстры изначально был предложен в качестве решения проблемы поиска кратчайших путей с одним источником. Однако алгоритм можно легко использовать для решения проблемы «Все пары кратчайших путей», выполнив вариант с одним источником, где каждый узел играет роль корневого узла.

В псевдокоде такая реализация могла бы выглядеть следующим образом:

 1    func DijkstraSSSP(G,v) {
 2        ... //standard SSSP-implementation here
 3        return dv;
 4    }
 5    
 6    func DijkstraAPSP(G) {
 7        D := |V|x|V|-Matrix
 8        for i from 1 to |V| {
 9           //D[v] denotes the v-th row of D
 10          D[v] := DijkstraSSP(G,i)
 11       }
 12   }

В этом примере мы предполагаем, что DijkstraSSSP берет график и корневой узел в качестве ввода. Результатом выполнения, в свою очередь, является список расстояний. . В , -th элемент хранит расстояние от корневого узла к узлу . Поэтому список точно соответствует -я строка матрицы расстояний APSP . По этой причине, DijkstraAPSP перебирает все узлы графа и выполняет DijkstraSSSP каждый из которых является корневым узлом, сохраняя результаты в .

Время выполнения DijkstraSSSP является поскольку мы ожидаем, что граф будет представлен с использованием матрицы смежности . Поэтому DijkstraAPSP имеет общее последовательное время выполнения .

Распараллеливание до | В | процессоры

[ редактировать ]

Тривиальное распараллеливание может быть получено путем распараллеливания цикла DijkstraAPSP в строке 8 . Однако при использовании последовательного DijkstraSSSP это ограничивает количество используемых процессоров количеством итераций, выполняемых в цикле. Следовательно, для этого тривиального распараллеливания — верхняя граница количества процессоров.

Например, пусть количество процессоров быть равным количеству узлов . Это приводит к тому, что каждый процессор выполняет DijkstraSSSP ровно один раз параллельно. Однако, когда есть только, например, доступных процессоров, каждый процессор должен выполнить DijkstraSSSP дважды.

В общей сложности это дает время выполнения , когда кратно . Следовательно, эффективность этого распараллеливания идеальна: процессоров сокращает время работы в разы .

Еще одним преимуществом такого распараллеливания является то, что связь между процессорами не требуется. Однако требуется, чтобы каждый процессор имел достаточно локальной памяти для хранения всей матрицы смежности графа.

Распараллеливание более | В | процессоры

[ редактировать ]

Если более чем для распараллеливания должны использоваться процессоры, требуется, чтобы несколько процессоров принимали участие в DijkstraSSSP расчет. По этой причине распараллеливание разделено на два уровня.

На первом уровне процессоры делятся на перегородки. Каждый раздел отвечает за вычисление одной строки матрицы расстояний. . Это означает, что каждый раздел должен оценить один DijkstraSSSP исполнение с фиксированным корневым узлом. Согласно этому определению, каждый раздел имеет размер процессоры. Разделы могут выполнять свои вычисления параллельно, поскольку результаты каждого из них независимы друг от друга. Таким образом, распараллеливание, представленное в предыдущем разделе, соответствует размеру раздела 1 с процессоры.

Основная трудность заключается в распараллеливании нескольких процессоров, выполняющих DijkstraSSSP для одного корневого узла. Идея этого распараллеливания состоит в том, чтобы распределить управление списком расстояний. в DijkstraSSSP внутри раздела. Таким образом, каждый процессор в разделе несет исключительную ответственность за элементы . Например, рассмотрим и : это дает размер раздела . В этом случае первый процессор каждого раздела отвечает за , а второй процессор отвечает за и . Таким образом, общие списки расстояний равны .

The DijkstraSSSP алгоритм в основном состоит из повторения двух шагов: сначала ближайший узел в списке расстояний должен быть найден. Для этого узла кратчайший путь уже найден. Затем расстояние всех соседей должен быть скорректирован в .

Эти шаги необходимо изменить следующим образом, поскольку для распараллеливания было распределено по разделу:

  1. Найдите узел с кратчайшим расстоянием в .
    • Каждый процессор владеет частью : Каждый процессор сканирует локальный минимум в его части, например, с помощью линейного поиска.
    • Вычислить глобальный минимум в выполнив операцию сокращения для всех .
    • Трансляция глобального минимума ко всем узлам раздела.
  2. Отрегулируйте расстояние до всех соседей в
    • Каждый процессор теперь знает глобальный ближайший узел. и его расстояние. На основе этой информации скорректируйте соседей в которые управляются соответствующим процессором.

Общее время выполнения такой итерации DijkstraSSSP выполняется перегородкой размером можно вывести на основе выполненных подзадач:

  • Линейный поиск :
  • Операции широковещания и сокращения: их можно эффективно реализовать, например, с использованием биномиальных деревьев. Это приводит к накладным расходам на связь в размере .

Для -итераций, это приводит к общему времени выполнения . После замены определения это дает общее время выполнения для DijkstraAPSP: .

Основное преимущество этого распараллеливания заключается в том, что больше не требуется, чтобы каждый процессор хранил всю матрицу смежности. Вместо этого достаточно, чтобы каждый процессор внутри раздела хранил только столбцы матрицы смежности узлов, за которые он отвечает. Учитывая размер раздела , каждый процессор должен хранить только столбцы матрицы смежности. Однако недостатком этого распараллеливания является то, что оно сопряжено с накладными расходами на связь из-за операций сокращения и широковещания.

В этом примере используется граф, представленный на изображении, с четырьмя узлами.

Цель состоит в том, чтобы вычислить матрицу расстояний с процессоры. По этой причине процессоры разделены на четыре раздела по два процессора в каждом. Для иллюстрации мы сосредоточимся на разделе, который отвечает за вычисление кратчайших путей от узла A ко всем остальным узлам. Пусть процессоры этого раздела будут называться p1 и p2 .

Вычисление списка расстояний на различных итерациях показано на втором изображении.

Верхний ряд на изображении соответствует после инициализации нижний после завершения работы алгоритма. Узлы распределены таким образом, что отвечает за узлы A и B , а p2 — за C и D. p1 Список расстояний распределяется согласно этому. Для второй итерации выполненные подзадачи явно показаны на изображении:

  1. Вычисление узла локального минимума в
  2. Вычисление узла глобального минимума в через операцию сокращения
  3. Трансляция глобального минимального узла в
  4. Пометка глобального ближайшего узла как «завершенного» и настройка расстояния до его соседей.

Алгоритм Флойда – Уоршалла

[ редактировать ]

Алгоритм Флойда – Уоршалла решает проблему поиска всех пар кратчайших путей для ориентированных графов. Используя матрицу смежности графа в качестве входных данных, он итеративно вычисляет более короткие пути. После | В | итераций матрица расстояний содержит все кратчайшие пути. Ниже описана последовательная версия алгоритма в псевдокоде:

 1    func Floyd_All_Pairs_SP(A) {
 2         = A;
 3        for k := 1 to n do
 4            for i := 1 to n do
 5                for j := 1 to n do
 6                    
 7     }
разделение матрицы с двумерным отображением блоков

Где A матрица смежности , n = | В | количество узлов и D матрица расстояний.

Распараллеливание

[ редактировать ]

Основная идея распараллеливания алгоритма состоит в том, чтобы разделить матрицу и разделить вычисления между процессами. Каждый процесс закреплен за определенной частью матрицы. Распространенным способом достижения этой цели является 2-D Block Mapping . Здесь матрица разбивается на квадраты одинакового размера, и каждый квадрат присваивается процессу. Для -матрица и p процессы, каждый процесс вычисляет размерная часть матрицы расстояний. Для каждый процесс будет назначен ровно одному элементу матрицы. Из-за этого распараллеливание масштабируется только до максимума. процессы. Далее мы ссылаемся на процессу, который присвоен квадрату в i-й строке и j-м столбце.

Поскольку расчет частей матрицы расстояний зависит от результатов других частей, процессы должны взаимодействовать друг с другом и обмениваться данными. Далее мы ссылаемся на к элементу i-й строки и j-го столбца матрицы расстояний после k-й итерации. Чтобы рассчитать нам нужны элементы , и как указано в строке 6 алгоритма. доступно каждому процессу, поскольку оно было рассчитано самостоятельно на предыдущей итерации.

Кроме того, каждому процессу требуется часть k-й строки и k-го столбца таблицы. матрица. элемент содержит процесс в той же строке, а элемент содержит процесс в том же столбце, что и процесс, который хочет вычислить . Каждый процесс, вычисливший часть k-й строки в Матрица должна отправить эту часть всем процессам в своем столбце. Каждый процесс, вычисливший часть k-го столбца в матрица должна отправить эту часть всем процессам в своей строке. Все эти процессы должны выполнять операцию широковещательной передачи «один ко всем» по строке или столбцу. Зависимости данных показаны на изображении ниже.

Для двумерного отображения блоков нам необходимо изменить алгоритм следующим образом:

 1    func Floyd_All_Pairs_Parallel() {
 2        for k := 1 to n do {
 3            Each process  that has a segment of the k-th row of ,
              broadcasts it to the  processes;
 4            Each process  that has a segment of the k-th column of ,
              broadcasts it to the  processes;
 5            Each process waits to receive the needed segments;
 6            Each process computes its part of the  matrix;
 7        }
 8    }
зависимости данных в алгоритме Флойда

В строке 5 алгоритма у нас есть шаг синхронизации, чтобы гарантировать, что все процессы имеют данные, необходимые для вычисления следующей итерации. Чтобы улучшить время работы алгоритма, мы можем удалить этап синхронизации, не влияя на корректность алгоритма. Для этого каждый процесс начинает вычисления, как только у него появляются данные, необходимые для вычисления его части матрицы. Эта версия алгоритма называется конвейерным двумерным отображением блоков .

Время выполнения

[ редактировать ]

Время выполнения последовательного алгоритма определяется тройным вложенным циклом for. Вычисление в строке 6 может выполняться за постоянное время ( ). Следовательно, время выполнения последовательного алгоритма равно .

2-D отображение блоков

[ редактировать ]

Время выполнения распараллеленного алгоритма состоит из двух частей. Время для вычислений и часть для связи и передачи данных между процессами.

Поскольку в алгоритме нет дополнительных вычислений и вычисления поровну распределяются между p процессами, мы имеем время выполнения по вычислительной части.

На каждой итерации алгоритма выполняется операция широковещательной рассылки «один ко всем», выполняемая по строке и столбцу процессов. Есть элементы трансляции. После этого выполняется этап синхронизации. Сколько времени займут эти операции, во многом зависит от архитектуры используемой параллельной системы. Следовательно, время, необходимое для связи и передачи данных в алгоритме, равно .

Для всего алгоритма мы имеем следующее время выполнения:

Конвейерное двумерное отображение блоков

[ редактировать ]

Для времени выполнения передачи данных между процессами в конвейерной версии алгоритма мы предполагаем, что процесс может передать k элементов соседнему процессу за время. На каждом шагу есть элементы строки или столбца отправляются соседнему процессу. Такой шаг занимает время. После шаги, в которые поступают соответствующие данные первой строки и столбца время).

Значения последовательных строк и столбцов следуют с течением времени. в конвейерном режиме. Процесс завершает свое последнее вычисление после O( ) + О( ) время. Таким образом, дополнительное время, необходимое для связи в конвейерной версии, составляет .

Общее время выполнения конвейерной версии алгоритма составляет:

Библиография

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 5ad45cc21c7ed80e8fae9419d771bcfe__1714831020
URL1:https://arc.ask3.ru/arc/aa/5a/fe/5ad45cc21c7ed80e8fae9419d771bcfe.html
Заголовок, (Title) документа по адресу, URL1:
Parallel all-pairs shortest path algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)