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

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

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

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

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

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

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

  • Веб-страница, соединяющаяся — вершины графика являются веб-страницами, и ребра представляют гиперссылки между страницами.

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

В 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

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

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

Смотрите Изменяют Узлы и Ребра Существующего графика для некоторых общих примеров модификации графика.

Смотрите также

|

Похожие темы