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
Для просмотра документации необходимо авторизоваться на сайте