exponenta event banner

shortestpathtree

Дерево кратчайшего пути от узла

Описание

пример

TR = shortestpathtree(G,s) возвращает направленный граф, TR, который содержит дерево кратчайших путей от исходного узла s ко всем остальным узлам на графике. Если график взвешен (то есть G.Edges содержит переменную Weight), то эти веса используются как расстояния вдоль рёбер на графике. В противном случае все расстояния кромок принимаются равными 1.

пример

TR = shortestpathtree(G,s,t) вычисляет дерево кратчайших путей между несколькими исходными или целевыми узлами:

  • s может быть одним исходным узлом, и t может указывать несколько целевых узлов.

  • s может указывать несколько исходных узлов, и t может указать один целевой узел.

пример

TR = shortestpathtree(___,Name,Value) использует дополнительные параметры, заданные одним или несколькими аргументами пары Name-Value, используя любую из комбинаций входных аргументов в предыдущих синтаксисах. Например, shortestpathtree(G,s,'OutputForm','vector') возвращает числовой вектор, описывающий дерево кратчайшего пути.

пример

[TR,D] = shortestpathtree(___) дополнительно возвращает кратчайшее расстояние между узлами в дереве.

[TR,D,E] = shortestpathtree(___) дополнительно возвращает логический вектор E указывает, находится ли каждое ребро графа в TR.

Примеры

свернуть все

Найдите кратчайшие пути от исходного узла к каждому из других доступных узлов на графике и постройте график результатов.

Создайте направленный график.

s = [1 1 2 3 3 4 4 6 6 7 8 7 5];
t = [2 3 4 4 5 5 6 1 8 1 3 2 8];
G = digraph(s,t)
G = 
  digraph with properties:

    Edges: [13x1 table]
    Nodes: [8x0 table]

Вычислите кратчайшие пути от узла 1 к каждому из других доступных узлов на графике. Затем постройте график результирующего дерева поверх графика.

TR = shortestpathtree(G,1);
p = plot(G);
highlight(p,TR,'EdgeColor','r')

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

Поскольку нет пути от узла 1 к узлу 7, узел 7 отсоединяется от дерева.

Найдите кратчайшие пути от каждого узла на графике к целевому узлу и постройте график результатов.

Создайте и постройте график.

s = [1 1 1 1 1 1 1 2 2 7 7 7 7 9 9 3 3 1 6 4 8 10 6 8 4 5];
t = [2 3 4 5 6 8 7 6 7 5 6 8 9 6 8 6 10 10 10 10 10 11 11 11 8 8];
G = graph(s,t);
x = [0 0.5 -0.5 -0.5 0.5 0 1.5 0 2 -1.5 -2];
y = [0 0.5 0.5 -0.5 -0.5 2 0 -2 0 0 0];
plot(G,'XData',x,'YData',y)

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

Найдите кратчайшие пути от каждого узла на графике к узлу 10. Постройте график результирующего дерева.

TR = shortestpathtree(G,'all',10);
plot(TR)

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

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

Создайте и постройте график.

G = digraph(bucky);
plot(G)

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

Найдите кратчайшие пути от узла 23 к нескольким другим узлам. Определить OutputForm как cell для возврата кратчайших путей в массиве ячеек. Укажите два выхода для возврата кратчайших расстояний пути.

target = [1 5 13 32 44];
[TR,D] = shortestpathtree(G,23,target,'OutputForm','cell')
TR=5×1 cell array
    {[         23 22 21 4 5 1]}
    {[           23 22 21 4 5]}
    {[23 22 20 16 17 15 14 13]}
    {[      23 22 20 19 18 32]}
    {[      23 24 48 47 46 44]}

D = 1×5

     5     4     7     5     5

tree{j} - кратчайший путь от узла 23 к узлу target(j) с длиной D(j).

Найдите путь и длину пути от узла 21 к узлу 5.

path = TR{2}
path = 1×5

    23    22    21     4     5

path_length = D(2)
path_length = 4

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

свернуть все

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

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

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

Исходный узел (узлы), указанный как один или несколько индексов узлов или имен узлов, или как все узлы на графике с'all'.

  • При использовании в одиночку s необходимо указать один исходный узел.

  • При использовании вместе с t, s и t входные данные должны удовлетворять:

    • s может быть одним исходным узлом, и t может указывать несколько целевых узлов.

    • s может указывать несколько исходных узлов, и t может указать один целевой узел.

В этой таблице показаны различные способы ссылки на один или несколько узлов по их числовым индексам узлов или по их именам.

ФормаОдин узелНесколько узлов
Индекс узла

Скаляр

Пример: 1

Вектор

Пример: [1 2 3]

Имя узла

Символьный вектор

Пример: 'A'

Массив ячеек символьных векторов

Пример: {'A' 'B' 'C'}

Строковый скаляр

Пример: "A"

Строковый массив

Пример: ["A" "B" "C"]

s не должно указывать имя узла 'all', поскольку это имя узла конфликтует с именем опции. Использовать findnode чтобы вместо этого передать индекс узла для этого случая.

Пример: shortestpathtree(G,'a')

Пример: shortestpathtree(G,[1 2 3],8)

Целевые узлы, указанные как один или несколько индексов узлов или имен узлов, или как все узлы на графике с'all'.

s и t входные данные должны удовлетворять:

  • s может быть одним исходным узлом, и t может указывать несколько целевых узлов.

  • s может указывать несколько исходных узлов, и t может указать один целевой узел.

t не должны указывать узлы с именами 'all', 'Method', или 'OutputForm', поскольку эти имена узлов конфликтуют с именами опций. Использовать findnode чтобы вместо этого передать индекс узла для этих случаев.

Пример: shortestpathtree(G,[1 2 3],8)

Пример: shortestpathtree(G,{'a','b','c'},{'f'})

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

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

Пример: [TR,D] = shortestpathtree(G,s,t,'Method','unweighted','OutputForm','vector')

Формат вывода, определяемый как разделенная запятыми пара, состоящая из 'OutputForm' и один из вариантов в таблице.

ВыборОписание
'tree' (по умолчанию)

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

'cell'

TR является массивом ячеек, и TR{k} содержит путь от s кому t(k) или от s(k) кому t. Если между узлами нет пути, то TR{k} пуст.

Если s и t являются именами узлов, то TR{k} является массивом ячеек символьных векторов. В противном случае TR{k} - числовой вектор.

Если указано, третий выход E - массив ячеек, указывающий края каждого соответствующего пути в TR.

'vector'

TR - вектор, описывающий дерево:

  • Если s содержит один исходный узел, затем TR(k) - идентификатор узла, предшествующего узлу, k на пути от s кому k. По конвенции, TR(s) = 0.

  • Если s содержит несколько исходных узлов, затем TR(k) - идентификатор узла, который успешно прошел k на пути от k кому t. По конвенции, TR(t) = 0.

В каждом случае TR(k) является NaN если узел k не является частью дерева.

Если указано, третий выход E является вектором, где E(k) дает индекс края соединительного узла дерева кратчайших путей k и узел TR(k).

Пример: shortestpathtree(G,s,'OutputForm','vector')

Алгоритм кратчайшего пути, заданный как разделенная запятыми пара, состоящая из 'Method' и один из вариантов в таблице.

ВыборОписание
'auto' (по умолчанию)

'auto' опция автоматически выбирает алгоритм:

  • 'unweighted' используется для graph и digraph входы без веса кромок.

  • 'positive' используется для всех graph входные данные, имеющие веса кромок и требующие, чтобы веса были неотрицательными. Эта опция также используется для digraph входы с неотрицательными кромочными весами.

  • 'mixed' используется для digraph входные данные, веса кромок которых содержат некоторые отрицательные значения. График не может иметь отрицательные циклы.

'unweighted'

Ширина (Breadth) - первый расчет, который рассматривает все веса кромок как 1.

'positive'

Алгоритм Dijkstra, который требует, чтобы все веса ребер были неотрицательными.

'mixed' (только для digraph)

Алгоритм Беллмана - Форда для направленных графов, который требует, чтобы граф не имел отрицательных циклов.

В то время как 'mixed' медленнее, чем 'positive' для той же проблемы, 'mixed' является более универсальным, поскольку позволяет некоторым весам края быть отрицательными.

'acyclic' (только для digraph)

Алгоритм, предназначенный для повышения производительности направленных ациклических графов (DAG) с взвешенными рёбрами.

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

Примечание

Для большинства графиков: 'unweighted' является самым быстрым алгоритмом, за которым следует 'acyclic', 'positive', и 'mixed'.

Пример: shortestpath(G,s,t,'Method','acyclic')

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

свернуть все

Дерево кратчайшего пути, возвращенное как digraph объект, массив ячеек или вектор, в зависимости от значения 'OutputForm'. Используйте highlight функция для визуализации дерева кратчайших путей поверх графика или использование plot(TR) для визуализации дерева кратчайшего пути самостоятельно.

Если существует несколько кратчайших путей между двумя узлами, то TR содержит только один из путей. Возвращаемый путь может изменяться в зависимости от того, какой алгоритм задан Method. TR output - это граф с нулевыми рёбрами, если нет путей, соединяющих один из указанных узлов.

Расстояние между исходным и целевым узлами, возвращаемое в виде вектора. Значение Inf указывает на отсутствие пути между двумя узлами.

Ребра в дереве или на пути, возвращаемые как логический вектор, массив ячеек или вектор, в зависимости от значения 'OutputForm':

  • Если не указать 'OutputForm' или укажите значение 'tree', то E является логическим вектором, указывающим, находится ли каждое ребро графа в направленном графе TR. Эти выходные данные совместимы с 'Edges' пара имя-значение highlight, например: highlight(p,'Edges',E).

  • Если 'OutputForm' является 'cell', то E - массив ячеек, содержащий края соответствующих путей в TR.

  • Если 'OutputForm' является 'vector', то E является вектором, который для каждого узла дает индекс ребра, соединяющего его с родительским узлом в дереве кратчайшего пути.

Совет

  • shortestpath, shortestpathtree, и distances функции не поддерживают неориентированные графы с отрицательными весами рёбер или, в более общем случае, любой граф, содержащий отрицательный цикл, по следующим причинам:

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

    • Единственный отрицательный вес ребра в неориентированном графике создает отрицательный цикл.

См. также

| | | |

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