Ориентированные и неориентированные графы

Что такое график?

График является набором узлов и ребер, которая представляет отношения:

  • Узлы являются вершинами, которые соответствуют объектам.

  • Ребра являются соединениями между объектами.

  • Ребра графика иногда имеют Веса, которые указывают на силу (или какой-либо другой атрибут) каждого соединения между узлами.

Эти определения являются общими, так как точное значение узлов и ребер в графике зависит от конкретного приложения. Например, можно смоделировать дружбу в социальной сети с помощью графика. Узлы графика - это люди, а ребра представляют дружбу. Естественное соответствие графиков физическим объектам и ситуациям означает, что можно использовать графики для моделирования широкого спектра систем. Для примера:

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

  • Аэропорты - узлами графика являются аэропорты, а ребра представляют рейсы между аэропортами.

В MATLAB®, graph и digraph функции создают объекты, которые представляют неориентированные и ориентированные графы.

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

    Plot showing an undirected graph with directionless edges.

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

    Plot showing a directed graph with one-way edges.

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

Самоциклы и мультиграфики

Графики, созданные с помощью graph и digraph может иметь одни или несколько самоциклов, которые являются ребрами, соединяющими узел с самим собой. Кроме того, графики могут иметь несколько ребер с одним и тем же исходным и целевым узлами, и график затем известен как мультиграфик. Мультиграфик может содержать или не содержать самоциклов.

В целях функций алгоритма графика в MATLAB, график, содержащий узел с одним самоциклом, не является мультиграфиком. Однако, если график содержит узел с несколькими самоциклами, это мультиграфик.

Для примера следующий рисунок показывает неориентированный мультиграфик с самоциклами. Узел A имеет три самоциклов, в то время как узел C имеет один. График содержит эти три условия, любое из которых делает его мультиграфиком.

  • Узел A имеет три самоциклов.

  • Узлы A и B имеют пять ребер между ними.

  • Узлы A и C имеют два ребер между ними.

Plot showing a multigraph. There are multiple edges connecting node A to node B, and node A also has several self-loops.

Чтобы определить, является ли данный график мультиграфиком, используйте ismultigraph функция.

Создание графиков

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

Матрица смежности

Один из способов представления информации о графике - с квадратной матрицей смежности. Ненулевые значения в матрице смежности указывают на ребро между двумя узлами, а значение записи указывает на вес ребра. Диагональные элементы матрицы смежности обычно равны нулю, но ненулевой диагональный элемент указывает на самоцикл или узел, который соединяется с собой ребром.

  • Когда вы используете graph чтобы создать неориентированный граф, матрица смежности должна быть симметричной. На практике матрицы часто являются треугольными, чтобы избежать повторения. Чтобы создать неориентированный граф, используя только верхний или нижний треугольник матрицы смежности, используйте graph(A,'upper') или graph(A,'lower') .

  • Когда вы используете digraph чтобы создать ориентированный граф, матрица смежности не должна быть симметричной.

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

  • Вы не можете создать мультиграфик из матрицы смежности.

Например, рассмотрим этот неориентированный граф.

Plot showing an undirected graph with three nodes and three edges. The edge AB has a weight of 1, AC a weight of 2, and BC a weight of 3.

Можно представлять график с этой матрицей смежности:

(012103230).

Чтобы создать график в 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 функция для поиска взвешенной или невзвешенной разреженной матрицы смежности ранее существовавшего графика.

Список ребер

Другой способ представления информации о графике - это описание его с помощью списка всех ребер.

Для примера рассмотрим тот же неориентированный граф.

Plot showing an undirected graph with three nodes and three edges. The edge AB has a weight of 1, AC a weight of 2, and BC a weight of 3.

Теперь представьте график по списку ребер

     Вес ребра(A,B)(A,C)12(B,C)3

Из списка ребер легко сделать вывод, что график имеет три уникальных узла, 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

Извлечь подграфик

Некоторые общие примеры изменения графика см. в разделе «Изменение узлов и ребер существующего графика».

См. также

|

Похожие темы