График является набором узлов и ребер, который представляет отношения:
Узлы являются вершинами, которые соответствуют объектам.
Ребра являются связями между объектами.
Ребра графика иногда имеют Веса, которые указывают на силу (или некоторый другой атрибут) каждой связи между узлами.
Эти определения являются общими, когда точное значение узлов и ребер в графике зависит от определенного приложения. Например, можно смоделировать дружбу в социальной сети с помощью графика. Вершины графика являются людьми, и ребра представляют дружбу. Естественное соответствие графиков к физическим объектам и ситуациям означает, что можно использовать графики, чтобы смоделировать большое разнообразие систем. Например:
Веб-страница, соединяющаяся — вершины графика являются веб-страницами, и ребра представляют гиперссылки между страницами.
Аэропорты — Вершины графика являются аэропортами, и ребра представляют рейсы между аэропортами.
В 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
диграф
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
объект, можно использовать множество функций, чтобы изменить структуру графика или определить, сколько узлов или ограничивается, график имеет. Эта таблица приводит некоторые доступные функции для изменения или запроса graph
и digraph
объекты.
addedge | Добавьте одно или несколько ребер в график |
rmedge | Удалите одно или несколько ребер из графика |
addnode | Добавьте один или несколько узлов в график |
rmnode | Удалите один или несколько узлов из графика |
findnode | Найдите определенный узел в графике |
findedge | Найдите определенное ребро в графике |
numnodes | Найдите количество узлов в графике |
numedges | Найдите количество ребер в графике |
edgecount | Количество ребер между заданными узлами |
flipedge | Инвертируйте направление ребер ориентированного графа |
reordernodes | Переставьте порядок узлов в графике |
subgraph | Извлечение подграфа |
Смотрите Изменяют Узлы и Ребра Существующего графика для некоторых общих примеров модификации графика.