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