График является набором узлов и ребер, который представляет отношения:
Узлы являются вершинами, которые соответствуют объектам.
Ребра являются связями между объектами.
Ребра графика иногда имеют Веса, которые указывают на силу (или некоторый другой атрибут) каждой связи между узлами.
Эти определения являются общими, когда точное значение узлов и ребер в графике зависит от определенного приложения. Например, можно смоделировать дружбу в социальной сети с помощью графика. Вершины графика являются людьми, и ребра представляют дружбу. Естественное соответствие графиков к физическим объектам и ситуациям означает, что можно использовать графики, чтобы смоделировать большое разнообразие систем. Например:
Веб-страница, соединяющаяся — вершины графика являются веб-страницами, и ребра представляют гиперссылки между страницами.
Аэропорты — Вершины графика являются аэропортами, и ребра представляют рейсы между аэропортами.
В MATLAB®, graph
и digraph
функционирует объекты построения, которые представляют неориентированных и ориентированных графов.
Неориентированные графы имеют ребра, которые не имеют направления. Ребра указывают на двухстороннее отношение, в котором каждое ребро может быть пересечено в обоих направлениях. Эти данные показывают простого неориентированного графа с тремя узлами и тремя ребрами.
Ориентированные графы имеют ребра с направлением. Ребра указывают на одностороннее отношение, в котором каждое ребро может только быть пересечено в одном направлении. Эти данные показывают простого ориентированного графа с тремя узлами и двумя ребрами.
Точное положение, длина или ориентация ребер на рисунке графика обычно не имеют значения. Другими словами, тот же график может визуализироваться несколькими различными способами путем реорганизации узлов и/или искажения ребер, пока глубинная структура не изменяется.
Графики, созданные с помощью graph
и digraph
, могут иметь один или несколько самоциклов, которые являются ребрами, соединяющими узел с собой. Кроме того, графики могут иметь несколько ребер с теми же входными и выходными узлами, и график затем известен как мультиграф. Мультиграф может или не может содержать самоциклы.
В целях функций алгоритма графика в MATLAB график, содержащий узел с одним самоциклом, не является мультиграфом. Однако, если график содержит узел с несколькими самоциклами, это - мультиграф.
Например, следующие данные показывают неориентированный мультиграф с самоциклами. Узел A имеет три самоцикла, в то время как узел C имеет тот. График содержит эти три условия, любое из которых делает его мультиграфом.
Узел A имеет три самоцикла.
Узлы A и B имеют пять ребер между ними.
Узлы A и C имеют два ребра между ними.
Чтобы определить, является ли данный график мультиграфом, используйте функцию ismultigraph
.
Первичные способы создать график включают использование матрицы смежности или списка ребер.
Один способ представлять информацию в графике с квадратной матрицей смежности. Ненулевые записи в матрице смежности указывают на ребро между двумя узлами, и значение записи указывает на вес ребра. Диагональные элементы матрицы смежности обычно являются нулем, но ненулевой диагональный элемент указывает на самоцикл или узел, который соединяется с собой ребром.
Когда вы используете graph
, чтобы создать неориентированного графа, матрица смежности должна быть симметричной. На практике матрицы являются часто треугольными, чтобы избежать повторения. Чтобы создать неориентированного графа с помощью только верхний или более низкий треугольник матрицы смежности, используйте graph(A,'upper')
или graph(A,'lower')
.
Когда вы используете digraph
, чтобы создать ориентированного графа, матрица смежности не должна быть симметричной.
Для больших графиков матрица смежности содержит много нулей и обычно является разреженной матрицей.
Вы не можете создать мультиграф из матрицы смежности.
Например, рассмотрите этого неориентированного графа.
Можно представлять график с этой матрицей смежности:
Чтобы создать график в MATLAB, введите:
A = [0 1 2; 1 0 3; 2 3 0]; node_names = {'A','B','C'}; G = graph(A,node_names)
G = graph with properties: Edges: [3×2 table] Nodes: [3×1 table]
Можно использовать graph
или функции digraph
, чтобы создать график с помощью матрицы смежности, или вы можете использовать функцию adjacency
, чтобы найти взвешенное или облегчили разреженную матрицу смежности существующего ранее графика.
Другой способ представлять информацию в графике путем листинга всех ребер.
Например, рассмотрите того же неориентированного графа.
Теперь представляйте график списком ребер
Из списка ребер легко прийти к заключению, что график имеет три уникальных узла, A
, B
и C
, которые соединяются тремя перечисленными ребрами. Если бы график отключил узлы, они не были бы найдены в списке ребер и должны были бы быть заданы отдельно.
В MATLAB список ребер разделяется столбцом в исходные узлы и целевые узлы. Для ориентированных графов направление ребра (из источника, чтобы предназначаться) важно, но для неориентированных графов входной и выходной узел является взаимозаменяемым. Один способ создать этот график с помощью списка ребер состоит в том, чтобы использовать отдельные входные параметры для исходных узлов, целевых узлов и веса ребра:
source_nodes = {'A','A','B'}; target_nodes = {'B','C','C'}; edge_weights = [1 2 3]; G = graph(source_nodes, target_nodes, edge_weights);
И graph
и digraph
разрешают конструкцию простого графика или мультиграфа из списка ребер. После построения графика, G
, можно посмотреть на ребра (и их свойства) с командой G.Edges
. Порядок ребер в G.Edges
сортируется по исходному узлу (первый столбец) и во вторую очередь по целевому узлу (второй столбец). Для неориентированных графов узел с меньшим индексом перечислен как исходный узел, и узел с большим индексом перечислен как целевой узел.
Поскольку конкретная реализация graph
и digraph
зависит от разреженных матриц, многие из тех же затрат на индексацию применяются. Используя один из предыдущих методов, чтобы создать график целиком из пар триплета (source,target,weight)
более быстр, чем создание пустого графика и итеративно добавление большего количества узлов и ребер. Для лучшей производительности минимизируйте количество вызовов graph
, digraph
, addedge
, addnode
, rmedge
и rmnode
.
По умолчанию все узлы в графике, созданном с помощью graph
или digraph
, пронумерованы. Поэтому всегда можно обращаться к ним их числовым индексом узла.
Если график имеет имена узла (то есть, G.Nodes
содержит переменную Name
), то также можно обратиться к узлам в графике с помощью их имен. Таким образом, названный узлами в графике может быть упомянут или их индексами узла или именами узла. Например, узел 1
может быть назван, 'A'
.
Термин идентификатор узла охватывает оба аспекта идентификации узла. Идентификатор узла относится к индексу узла и к имени узла.
Для удобства MATLAB помнит, какой тип идентификатора узла вы используете, когда вы вызываете большинство функций графика. Таким образом, если вы обращаетесь к узлам в графике их индексами узла, большинство функций графика дает числовой ответ, который также относится к узлам их индексами.
A = [0 1 1 0; 1 0 1 0; 1 1 0 1; 0 0 1 0]; G = graph(A,{'a','b','c','d'}); p = shortestpath(G,1,4)
p = 1 3 4
Однако, если вы обращаетесь к узлам их именами, затем большинство функций графика дает ответ, который также относится к узлам их именами (содержавшийся в массиве ячеек из символьных векторов или массиве строк).
p1 = shortestpath(G,'a','d')
p1 = 1×3 cell array {'a'} {'c'} {'d'}
Используйте findnode
, чтобы найти числовой идентификатор узла для данного имени узла. С другой стороны, для данного числового идентификатора узла, индексируйте в G.Nodes.Name
, чтобы определить соответствующее имя узла.
После того, как вы создаете объект graph
или digraph
, можно использовать множество функций, чтобы изменить структуру графика или определить, сколько узлов или ограничивается, график имеет. Эта таблица приводит некоторые доступные функции для изменения или запроса объекты digraph
и graph
.
addedge | Добавьте одно или несколько ребер в график |
rmedge | Удалите одно или несколько ребер из графика |
addnode | Добавьте один или несколько узлов в график |
rmnode | Удалите один или несколько узлов из графика |
findnode | Найдите определенный узел в графике |
findedge | Найдите определенное ребро в графике |
numnodes | Найдите количество узлов в графике |
numedges | Найдите количество ребер в графике |
edgecount | Количество ребер между заданными узлами |
flipedge | Инвертируйте направление ребер ориентированного графа |
reordernodes | Переставьте порядок узлов в графике |
subgraph | Извлечение подграфа |
Смотрите Изменяют Узлы и Ребра Существующего графика для некоторых общих примеров модификации графика.