shortestpathtree

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

Описание

пример

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

пример

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

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

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

пример

TR = shortestpathtree(___,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'.

The 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' (по умолчанию)

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

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

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

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

'unweighted'

Breadth - первый расчет, которое рассматривает все веса ребер как 1.

'positive'

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

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

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

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

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

Алгоритм, разработанный для улучшения эффективности ориентированных ациклических графиков (ДАГ) с взвешенными ребрами.

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

Примечание

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

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

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

свернуть все

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

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

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

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

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

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

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

Совет

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

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

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

См. также

| | | |

Введенный в R2015b