exponenta event banner

расстояния

Кратчайшие расстояния пути для всех пар узлов

Описание

пример

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

пример

d = distances(G,s) ограничивает исходные узлы узлами, определенными s, такой, что d(i,j) - расстояние от узла s(i) к узлу j.

пример

d = distances(G,s,t) дополнительно ограничивает целевые узлы узлами, определенными t, такой, что d(i,j) - расстояние от узла s(i) к узлу t(j).

пример

d = distances(___,'Method',algorithm) дополнительно задает алгоритм, используемый при вычислении кратчайшего пути с использованием любого из входных аргументов в предыдущих синтаксисах. Например, если G является взвешенным графиком, то distances(G,'Method','unweighted') игнорирует веса кромок в G и вместо этого рассматривает все веса кромок как 1.

Примеры

свернуть все

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

s = [1 1 1 2 5 5 5 8 9];
t = [2 3 4 5 6 7 8 9 10];
G = graph(s,t);
plot(G)

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

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

d = distances(G)
d = 10×10

     0     1     1     1     2     3     3     3     4     5
     1     0     2     2     1     2     2     2     3     4
     1     2     0     2     3     4     4     4     5     6
     1     2     2     0     3     4     4     4     5     6
     2     1     3     3     0     1     1     1     2     3
     3     2     4     4     1     0     2     2     3     4
     3     2     4     4     1     2     0     2     3     4
     3     2     4     4     1     2     2     0     1     2
     4     3     5     5     2     3     3     1     0     1
     5     4     6     6     3     4     4     2     1     0

d симметричен, потому что G является неориентированным графом. В целом d(i,j) - длина кратчайшего пути между узлами i и узел j, и для неориентированных графиков это эквивалентно d(j,i).

Например, найдите длину кратчайшего пути между узлом 1 и узлом 10.

d(1,10)
ans = 5

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

s = [1 1 1 1 2 2 3 4 4 5 6];
t = [2 3 4 5 3 6 6 5 7 7 7];
G = graph(s,t);
plot(G)

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

Найдите кратчайшие расстояния от узла 1, узла 2 и узла 3 до всех других узлов на графике.

d = distances(G,[1 2 3])
d = 3×7

     0     1     1     1     1     2     2
     1     0     1     2     2     1     2
     1     1     0     2     2     1     2

Использовать d найти кратчайшее расстояние от узла 1 до узла 7.

d(1,7)
ans = 2

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

s = [1 1 1 2 2 3 3 4 5 5 6 7 8  8 10 11];
t = [2 3 10 4 12 5 4 6 6 7 9 8 9 11 11 12];
G = graph(s,t);
plot(G)

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

Найдите кратчайшие расстояния от узлов 5 и 7 до узлов 2 и 3.

sources = [5 7];
targets = [2 3];
d = distances(G,sources,targets)
d = 2×2

     3     1
     4     2

Использовать d найти кратчайшее расстояние пути между узлом 7 и узлом 3. В этом случае d(i,j) - расстояние от узла sources(i) к узлу targets(j).

d(2,2)
ans = 2

Создание и печать направленного графика с взвешенными ребрами.

s = [1 1 1 2 5 3 6 4 7 8 8 8];
t = [2 3 4 5 3 6 4 7 2 6 7 5];
weights = [100 10 10 10 10 20 10 30 50 10 70 10];
G = digraph(s,t,weights);
plot(G,'EdgeLabel',G.Edges.Weight)

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

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

d = distances(G)
d = 8×8

     0    90    10    10   100    30    40   Inf
   Inf     0    20    50    10    40    80   Inf
   Inf   110     0    30   120    20    60   Inf
   Inf    80   100     0    90   120    30   Inf
   Inf   120    10    40     0    30    70   Inf
   Inf    90   110    10   100     0    40   Inf
   Inf    50    70   100    60    90     0   Inf
   Inf   100    20    20    10    10    50     0

С тех пор G является направленным графом, d не является симметричным, и d(i,j) соответствует расстоянию между узлами i и j. Inf значения в d соответствуют узлам, которые недоступны. Например, поскольку узел 1 не имеет предшественников, невозможно достичь узла 1 из любого другого узла графа. Итак, первый столбец d содержит много Inf значения, отражающие недоступность узла 1.

По умолчанию distances использует веса кромок для вычисления расстояний. Определить 'Method' как 'unweighted' игнорировать веса кромок и рассматривать все расстояния кромок как 1.

d1 = distances(G,'Method','unweighted')
d1 = 8×8

     0     1     1     1     2     2     2   Inf
   Inf     0     2     4     1     3     5   Inf
   Inf     4     0     2     5     1     3   Inf
   Inf     2     4     0     3     5     1   Inf
   Inf     5     1     3     0     2     4   Inf
   Inf     3     5     1     4     0     2   Inf
   Inf     1     3     5     2     4     0   Inf
   Inf     2     2     2     1     1     1     0

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

свернуть все

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

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

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

Исходные узлы, указанные как один или несколько индексов узлов или имен узлов, или 'all' для выбора всех исходных узлов.

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

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

Скаляр

Пример: 1

Вектор

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

Имя узла

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

Пример: 'A'

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

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

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

Пример: "A"

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

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

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

Пример: distances(G,[1 2])

Пример: distances(G,'all',[1 3 5])

Целевые узлы, указанные как один или несколько индексов узлов или имен узлов, или 'all' для выбора всех целевых узлов.

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

Пример: distances(G,[1 2])

Пример: distances(G,'all',[1 3 5])

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

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

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

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

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

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

'unweighted'

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

'positive'

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

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

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

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

Примечание

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

Пример: distances(G,s,t,'Method','unweighted')

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

свернуть все

Кратчайшие расстояния между парами узлов, возвращаемые в виде матрицы. Размер d является (# исходные узлы) -by- (# целевые узлы). Значение Inf указывает несуществующий путь.

Совет

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

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

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

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