exponenta event banner

allpaths

Поиск всех путей между двумя узлами графика

Описание

пример

paths = allpaths(G,s,t) возвращает все пути в графе G которые начинаются в исходном узле s и заканчиваются в целевом узле t. Продукция paths - массив ячеек, в котором содержится содержимое каждой ячейки; paths{k} перечисляет узлы, лежащие на пути.

пример

[paths,edgepaths] = allpaths(G,s,t) также возвращает ребра на каждом пути из s кому t. Продукция edgepaths - массив ячеек, где edgepaths{k} дает края вдоль соответствующего пути, paths{k}.

пример

[___] = allpaths(G,s,t,Name,Value) указывает дополнительные параметры, использующие один или несколько аргументов «имя-значение». В предыдущих синтаксисах можно использовать любую комбинацию выходных аргументов. Например, можно указать MaxNumPaths и скаляр для ограничения количества возвращаемых путей.

Примеры

свернуть все

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

A = ones(4);
G = graph(A);
plot(G)

Figure contains an axes. The axes contains an object of type graphplot.

Вычислите все пути на графике, которые начинаются в узле 1 и заканчиваются в узле 3.

paths = allpaths(G,1,3)
paths=5×1 cell array
    {[  1 2 3]}
    {[1 2 4 3]}
    {[    1 3]}
    {[1 4 2 3]}
    {[  1 4 3]}

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

Создайте направленный мультиграф с восемью узлами и 18 ребрами. Укажите имена узлов. Постройте график с помеченными узлами и рёбрами.

s = [1 1 2 2 3 3 2 2 4 6 8 6 6 7 3 3 5 3];
t = [2 3 1 3 2 1 4 4 6 2 6 7 8 8 5 5 7 7];
names = {'A','B','C','D','E','F','G','H'};
G = digraph(s,t,[],names);
p = plot(G,'EdgeLabel',1:numedges(G));

Figure contains an axes. The axes contains an object of type graphplot.

Вычислите все пути между узлом A и узлом H. Укажите два выходных аргумента, чтобы вернуть индексы границ для краев вдоль каждого пути.

[paths,edgepaths] = allpaths(G,'A','H');

Просмотрите узлы и кромки вдоль первой траектории.

paths{1}
ans = 1x6 cell
    {'A'}    {'B'}    {'C'}    {'E'}    {'G'}    {'H'}

edgepaths{1}
ans = 1×5

     1     4     9    13    17

Выделите узлы и кромки вдоль первой траектории.

highlight(p,'Edges',edgepaths{1},'EdgeColor','r','LineWidth',1.5,'NodeColor','r','MarkerSize',6)

Figure contains an axes. The axes contains an object of type graphplot.

Используйте 'MaxNumPaths', 'MaxPathLength', и 'MinPathLength' параметры для ограничения числа путей, возвращаемых allpaths.

Создайте матрицу смежности для полного графика с 20 узлами. Создайте неориентированный граф из матрицы смежности, пропустив автоциклы.

A = ones(20);
G = graph(A,'omitselfloops');

Поскольку все узлы в графе связаны со всеми остальными узлами, в графе существует большое количество путей между любыми двумя узлами (более чем 1.7e16). Поэтому невозможно вычислить все пути между двумя узлами, поскольку результаты не поместятся в памяти. Вместо этого вычислите первые 10 путей от узла 2 к узлу 5.

paths1 = allpaths(G,2,5,'MaxNumPaths',10)
paths1=10×1 cell array
    {[                       2 1 3 4 5]}
    {[                     2 1 3 4 6 5]}
    {[                   2 1 3 4 6 7 5]}
    {[                 2 1 3 4 6 7 8 5]}
    {[               2 1 3 4 6 7 8 9 5]}
    {[            2 1 3 4 6 7 8 9 10 5]}
    {[         2 1 3 4 6 7 8 9 10 11 5]}
    {[      2 1 3 4 6 7 8 9 10 11 12 5]}
    {[   2 1 3 4 6 7 8 9 10 11 12 13 5]}
    {[2 1 3 4 6 7 8 9 10 11 12 13 14 5]}

Теперь вычислите первые 10 путей между узлом 2 и узлом 5, которые имеют длину пути, меньшую или равную 2.

paths2 = allpaths(G,2,5,'MaxNumPaths',10,'MaxPathLength',2)
paths2=10×1 cell array
    {[ 2 1 5]}
    {[ 2 3 5]}
    {[ 2 4 5]}
    {[   2 5]}
    {[ 2 6 5]}
    {[ 2 7 5]}
    {[ 2 8 5]}
    {[ 2 9 5]}
    {[2 10 5]}
    {[2 11 5]}

Наконец, вычислите первые 10 путей между узлом 2 и узлом 5, которые имеют длину пути, большую или равную 3.

paths3 = allpaths(G,2,5,'MaxNumPaths',10,'MinPathLength',3)
paths3=10×1 cell array
    {[                       2 1 3 4 5]}
    {[                     2 1 3 4 6 5]}
    {[                   2 1 3 4 6 7 5]}
    {[                 2 1 3 4 6 7 8 5]}
    {[               2 1 3 4 6 7 8 9 5]}
    {[            2 1 3 4 6 7 8 9 10 5]}
    {[         2 1 3 4 6 7 8 9 10 11 5]}
    {[      2 1 3 4 6 7 8 9 10 11 12 5]}
    {[   2 1 3 4 6 7 8 9 10 11 12 13 5]}
    {[2 1 3 4 6 7 8 9 10 11 12 13 14 5]}

Входные аргументы

свернуть все

Входной график, указанный как graph или digraph объект. Использовать graph для создания неориентированного графика или digraph для создания направленного графа.

Пример: G = graph(1,2)

Пример: G = digraph([1 2],[2 3])

Идентификаторы исходного и целевого узлов, указанные как отдельные аргументы индексов узлов или имен узлов.

СтоимостьПример
Индекс скалярного узла1
Имя узла вектора символов'A'
Имя скалярного узла строки"A"

Пример: allpaths(G,2,5) вычисляет все пути между узлом 2 и узлом 5.

Пример: allpaths(G,'node1','node2') вычисляет все пути между названными узлами node1 и node2.

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: allpaths(G,s,t,'MaxNumPaths',100) возвращает только первые 100 результатов в лексикографическом порядке путей.

Максимальное количество путей, указанное как разделенная запятыми пара, состоящая из 'MaxNumPaths' и неотрицательный целочисленный скаляр. Этот параметр полезен, когда количество путей между двумя узлами увеличивается настолько, что достигает предельных значений памяти. Можно указать MaxNumPaths для ограничения количества путей, возвращаемых allpaths чтобы результаты умещались в доступной памяти.

Пример: allpaths(G,s,t,'MaxNumPaths',100)

Максимальная длина пути, указанная как разделенная запятыми пара, состоящая из 'MaxPathLength' и неотрицательный целочисленный скаляр. Этот параметр фильтрует результаты, возвращенные allpaths чтобы не возвращались пути с длиной больше указанного предела. Длина контура измеряется количеством краев в нем, игнорируя веса краев.

Чтобы найти пути с диапазоном длин, укажите оба 'MaxPathLength' и 'MinPathLength'. Чтобы найти контуры с точно заданной длиной, укажите одно и то же значение для обоих 'MaxPathLength' и 'MinPathLength'.

Пример: allpaths(G,s,t,'MaxPathLength',4) возвращает пути, длина которых меньше или равна 4.

Пример: allpaths(G,s,t,'MinPathLength',3,'MaxPathLength',5) возвращает пути длиной 3, 4 или 5.

Минимальная длина пути, указанная как разделенная запятыми пара, состоящая из 'MinPathLength' и неотрицательный целочисленный скаляр. Этот параметр фильтрует результаты, возвращенные allpaths чтобы не возвращались пути с длиной меньше указанного предела. Длина контура измеряется количеством краев в нем, игнорируя веса краев.

Чтобы найти пути с диапазоном длин, укажите оба 'MaxPathLength' и 'MinPathLength'. Чтобы найти контуры с точно заданной длиной, укажите одно и то же значение для обоих 'MaxPathLength' и 'MinPathLength'.

Пример: allpaths(G,s,t,'MinPathLength',2) возвращает пути, длина которых больше или равна 2.

Пример: allpaths(G,s,t,'MinPathLength',3,'MaxPathLength',5) возвращает пути длиной 3, 4 или 5.

Выходные аргументы

свернуть все

Пути между указанными узлами, возвращаемые в виде массива ячеек. Каждый элемент paths{k} содержит узлы, расположенные вдоль одного из путей между указанным исходным и целевым узлами. Пути возвращаются в лексикографическом порядке. Если исходный и целевой узлы s и t укажите тот же узел, затем по соглашению allpaths возвращает единственный путь, содержащий этот узел. Если узел t недоступен из узла s, то paths пуст.

Тип данных записей в paths зависит от пути s и t указаны:

  • Если s и t указываются как числовые индексы узлов, затем каждый элемент paths{k} - числовой вектор индексов узлов.

  • Если s и t указываются как имена строковых узлов, затем каждый элемент paths{k} - строковый массив имен узлов.

  • Если s и t указываются как имена узлов векторов символов, затем каждый элемент paths{k} - массив ячеек имен узлов символьных векторов.

Кромки вдоль каждого пути, возвращаемые в виде массива ячеек. Каждый элемент edgepaths{k} содержит индексы кромок, лежащих вдоль соответствующего пути, paths{k}. Если узел t недоступен из узла s, то edgepaths пуст.

Совет

  • Количество путей в графе сильно зависит от структуры графа. Для некоторых структур графов число путей может увеличиваться экспоненциально с числом узлов. Например, полный граф с 12 узлами, заданными G = graph(ones(12)) содержит почти 10 миллионов путей между любыми двумя его узлами. Используйте MaxNumPaths, MaxPathLength, и MinPathLength пары имя-значение для управления выходом allpaths в этих случаях.

Представлен в R2021a