exponenta event banner

toposort

Топологический порядок направленного ациклического графа

Описание

пример

n = toposort(G) возвращает топологический порядок узлов в G такой, что i < j для каждого края (n(i),n(j)) в G. Направленный граф G не может иметь никаких циклов.

пример

n = toposort(G,'Order',algorithm) определяет алгоритм упорядочения. Например, toposort(G,'Order','stable') использует алгоритм стабильного упорядочения, основанный на лексикографическом порядке узлов.

пример

[n,H] = toposort(___) дополнительно возвращает направленный граф H узлы которых находятся в заданном топологическом порядке. В предыдущих синтаксисах можно использовать любую комбинацию входных аргументов.

Примеры

свернуть все

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

A = [0 1 1 0 0 0 0
     0 0 0 1 0 0 0
     0 1 0 1 0 0 1
     0 0 0 0 1 1 0
     0 0 0 0 0 0 0
     0 0 0 0 1 0 0
     0 0 0 0 1 0 0];
names = {'Calculus I','Linear Algebra','Calculus II', ...
    'Multivariate Calculus','Topology', ...
    'Differential Equations','Real Analysis'};
G = digraph(A,names);
plot(G)

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

Найдите топологическую сортировку курсов, чтобы определить правильный порядок их прохождения.

N = toposort(G)
N = 1×7

     1     3     7     2     4     6     5

G.Nodes.Name(N,:)
ans = 7x1 cell
    {'Calculus I'            }
    {'Calculus II'           }
    {'Real Analysis'         }
    {'Linear Algebra'        }
    {'Multivariate Calculus' }
    {'Differential Equations'}
    {'Topology'              }

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

rng default;
A = tril(sprand(10, 10, 0.3), -1)~=0;
G = digraph(A);
[~,G] = toposort(G);
plot(G)

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

Найдите топологическую сортировку узлов графика. Несмотря на то, что G уже находится в топологическом порядке, (1 2 3 4 5 6 7 8 9 10), toposort переупорядочивает узлы.

toposort(G)
ans = 1×10

     2     1     4    10     9     8     5     7     3     6

Определить Order как 'stable' для использования алгоритма стабильного упорядочения, так что сортировка сначала упорядочивает узлы с меньшими индексами. Стабильная сортировка не изменяется G если он уже находится в топологическом порядке.

toposort(G,'Order','stable')
ans = 1×10

     1     2     3     4     5     6     7     8     9    10

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

свернуть все

Входной график, заданный как digraph объект. G должен быть направленным ациклическим графом. Использовать isdag подтвердить, что G не содержит циклов.

Использовать digraph для создания направленного графа.

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

Алгоритм упорядочения, указанный как 'fast' или 'stable':

'fast' (по умолчанию)

На основе поиска по глубине. Узел добавляется в начало списка после рассмотрения всех его потомков.

Если G уже находится в топологическом порядке, этот метод может изменить порядок узлов.

'stable'

На основе лексикографического приказа. n(1) - узел с наименьшим индексом, n(2) следующее наименьшее заданное n(1)и так далее.

Если G находится в топологическом порядке, то H неизменен и n является 1:numnodes(G).

Пример: [n,H] = toposort(G,'Order','stable')

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

свернуть все

Индексы узлов, возвращаемые в виде вектора строк.

Топологически отсортированный граф, возвращенный как digraph объект. H является тем же графом, что и G, но узлы переупорядочены в соответствии с n.

Подробнее

свернуть все

Топологический порядок

Топологическое упорядочение направленного графа - это упорядочение узлов в графе таким образом, что каждый узел предстаёт перед его преемниками (потомками).

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

См. также

| |

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