Определение гамильтонова пути в графе

Гамильтонов путь в графе – это путь, проходящий через все вершины графа, причем каждая вершина встречается в нем только один раз. Если этот путь замкнут, то говорят о гамильтоновом цикле или контуре.

В качестве примера рассмотрим задачу определения очередности решения на ЭВМ вычислительной программы (алгоритма) А,состоящей из п подпрограмм Ai ; i=1,2,…,n , причем на порядок выполнения подпрограмм накладываются ограничения в виде

Ai → Aj , (4.1)

т.е. выполнение подпрограммы Ai предшествует выполнению подпрограммы Aj , i, j Î {1,2,…,n} или

Ai Определение гамильтонова пути в графе - student2.ru Aj , (4.2)

т.е. порядок выполнения программ Ai и Aj безразличен.

Эту задачу удобно геометрически отобразить в виде графа, где каждой i вершине соответствует Ai - подпрограмма, а связи между подпрограммами соответствуют дугам или ребрам. Причем дуга соответствует связи Ai → Aj , а ребро - связи Ai Определение гамильтонова пути в графе - student2.ru Aj .

Если предполагается, что программа A будет выполнена, когда выполнены все подпрограммы Ai , i=1,2,…,n (без повторений), то определение очередности выполнения подпрограмм Aiсводится к определению на графе гамильтонова пути. Очевидно, что эту задачу можно решить перебором всех возможных вариантов (n! в насыщенном графе) с одновременной проверкой выполнения всех условий (4.1), (4.2). При n = 2 максимально возможно всего два варианта, при n = 3 - шесть, при n=10 существует более трех с половиной миллионов возможных вариантов, из которых надо выбрать допустимые, удовлетворяющие условиям (4.1), (4.2).

Решение поставленной задачи может быть облегчено, если воспользоваться алгоритмом Фаулкса, позволяющим во многих случаях значительно уменьшить количество рассматриваемых возможных вариантов [1].

Алгоритм Фаулкса. Рассматривается n операций (вершины графа) A1, A2,…, An , между которыми существуют соотношения:

Ai → Aj , Ai → Aj , i, j Î {1,2,…,n} (4.3)

Задача состоит в том, что среди всех возможных путей найти, если это возможно, путь (или несколько путей), проходящий один и только один раз через каждую извершин графа и удовлетворяющий написанным выше соотношениям (4.3), то есть гамильтонов путь.

Идея вычислений, которые необходимо выполнить при использовании алгоритма Фаулкса, заключается в нахождении матрицы RN путем последовательногобулевого умножения Определение гамильтонова пути в графе - student2.ru матрицы R1 достижимости не более чем за один шаг саму на себяN раз (матрица R1 может быть получена из матрицы смежности R в результате подстановки единиц на главной диагонали).

 
  Определение гамильтонова пути в графе - student2.ru

 
  Определение гамильтонова пути в графе - student2.ru

Элементы rNij матрицыRN, определяются как

Вычисления следует прекратить, если RN = RN-1 .

На каждом цикле вычисления возможны некоторые упрощения матрицы, связанные с выявлением «начальных» и «конечных» вершин, ограничивающих возможность дальнейшего построения ГП из общего множества возможных путей в графе.

Порядок решения задачи:

1. Задаем номер цикла вычислений N=1.

2. Используя соотношения (4.3), составляем граф, вершины которого есть операции, а направленные дуги графа определяются заданными соотношениями между операциями.

3. Составляем матрицу R1 графа, элементы r1ij которой могут принимать значения 0 либо 1. Если r1ij = 1, то это указывает на то, что операция (вершина) Aj должна следовать за операцией (вершиной) Ai . Полученная таким образом матрица R1 является булевой матрицей (каждый элемент может принимать значения 0 или 1). Она является исходной для всех дальнейших вычислений.

4. Используя матрицу RN (на первом цикле вычислений RN = R1), длякаждой вершины графа (операции) проверяем принадлежность ее кначальной или конечной вершине ГП по следующим правилам.

Вершина (операция) является начальной вершиной ГП, если во всей строке матрицы стоят единицы, а во всем столбце (за исключением их пересечения) - нули. Вершина (операция) является конечной вершиной ГП, то во всей строке матрицы стоят нули (за исключением их пересечения), а во всем столбце - единицы.

5. Упрощаем матрицу RN графа, вычеркивая из нее строки и столбцы, соответствующие начальной или (и) конечной вершине ГП. Получаем матрицу (RN)'.

6. Увеличиваем на единицу номер цикла, т.е. N=N+1.

7. Находим матрицу (RN)', выполнив булевое умножение матрицы (RN-1)' на матрицу (R1)' , которая получается из исходной матрицы R1 вычеркиванием из нее строк и столбцов, соответствующих начальным и конечным вершинам ГП, найденным во всех предыдущих циклах вычислений. Булевое перемножение матриц производится по обычным правилам умножения, только вместо умножения используется конъюнкция, а вместо сложения – дизъюнкция.

8. Проверяем условие выполнения равенства матриц (RN)' и (RN-1)'.

Если это условие выполняется, то переходим к п. 10, Иначе - к п. 9.

9. Проверяем условие равенства всех элементов матрицы RN единице. Если это условие выполняется, то нет необходимости в дальнейших вычислениях матрицы (RN)', так как очевидно, что (RN+1)'=(RN)', переходим к п. 10. Если нет - к п. 4.

10. Составляем матрицу Rb , возвращая в матрицу (RN)' , строки и столбцы, вычеркнутые в п. 5 во всех циклах вычислений.

11. Составляем матрицу Rc , перегруппировывая одновременно строки и столбцы матрицы Rb таким образом, чтобы все нули были расположены под главной диагональю, а единицы - над ней.

Квадратные матрицы, состоящие из единиц, опирающихся на главную диагональ, образуют классы эквивалентности вершин (совокупности вершин графа, эквивалентных с точки зрения очередности их присутствия в гамильтоновом пути).

Если для данного графа мы получилиm классов эквивалентности (m £ n), то есть B1,…,Bm , и в каждый класс эквивалентности Bd , d = 1,2,…,m входят Sd вершин графа, то можно сказать, что вершины, входящие в класс эквивалентности Bd, расположенные выше и левее класса эквивалентности Bl в матрице Rc будут предшествовать в Гамильтоновом пути вершинам из класса эквивалентности Bl .

Нахождение Гамильтоновых путей в этом случае значительно упрощается. В соответствии с классами эквивалентности мы получили упорядоченные группы вершин. В качестве начальной выбирается вершина из первого класса эквивалентности. Если их в нем несколько, то следующая выбирается из этого же класса и так до тех пор, пока не будут исчерпаны все вершины этого класса. Затем переходим к вершинам следующего класса и т.д. пока не будут использованы все вершины графа и построен ГП. Следует заметить, что при выборе очередной вершины необходимо обязательно проверять выполнение условий (4.3). Если условия не выполняются, очередность следования вершин из одного класса эквивалентности меняется. Максимальное число возможных вариантов сокращается до произведения B1 ! ∙ B2 ! ∙ ,…, ∙ Bm !

Пример. Пусть программа A состоит из 6 операций (подпрограмм) A1, A2,…, A6 , между которыми существуют следующие соотношения:

A1 → A2 , A2 → A3 , A3 → A4 , A5 → A2 , A6 → A2 ,

A1 → A4, A2 → A4, A5 → A4 , A6 → A4 ,

A1 → A6, A2 → A5 , A6 → A5

A2 → A6 . (4.4)

Цель задачи состоит в нахождении пути, проходящего только один раз через все операции (вершины графа) и удовлетворяющего написанным соотношениям. Без учета ограничений (4.4) всего возможно 6! = 720 вариантов следования вершин.

Для решения задачи воспользуемся приведенным алгоритмом.

1. Зададим номер цикла N = 1.

2. Составим граф (рис. 4.1), соответствующий соотношениям (4.4).

 
  Определение гамильтонова пути в графе - student2.ru

Рис. 4.1

3. Составим матрицу R1 достижимости не более чем за один шаг.

Определение гамильтонова пути в графе - student2.ru

4. Проверим матрицу R1 на наличие начальной или конечной вершин в графе.

Очевидно, что A4 есть конечная вершина каждого гамильтонова пути, поскольку никакая дуга не имеет эту вершину своим началом, тогда как дуга, исходящая из любой другой вершины, достигает вершину A4. Это свойство выражается наличием единиц во всем столбце A4 и нулей во всей строке A4 (за исключением их пересечения).

5. Вычеркиваем столбец и строку A4. Получаем матрицу (R1)' .

Определение гамильтонова пути в графе - student2.ru

6. N=1+1=2.

7. Произведем булевое умножение матриц ) (R1)' Ä (R1)' = (R2)'.

Наличие 1 в матрице означает существование между соответствующими вершинами путей длиной меньшей или равной двум, а 0 - их отсутствие.

Определение гамильтонова пути в графе - student2.ru

8. Проверяем условие равенства (R2) ' и (R1)' . Так как они не равны, переходим к п. 9.

9. Проверяем условие равенства всех элементов матрицы единице. Так как оно не выполняется, то возвращаемся к п.4.

4. Рассмотрим матрицу (R2) ' .

Вершина A3 , является конечной вершиной гамильтонова пути на данном цикле вычислений.

5. Вычеркиваем столбец и строку A3. Оставшаяся матрица имеет вид

(R2) ' = Определение гамильтонова пути в графе - student2.ru .

6. N=2+1=3.

7. Производим умножение (R2 )'Ä (R ' ) = (R3 )'.

(R 3) ' = Определение гамильтонова пути в графе - student2.ru .

8. (R3) ' ¹ (R2 ) '

9. Все элементы (RN) ', равны единице. Очевидно, что матрицы (R4) ' , (R5) ' и т.д. также будут равны, т.к. будут иметь все элементы, равные единице.

Переходим к п.10.

10. Матрицу R b получаем возвращением строк и столбцов, вычеркнутых в п. 5.

Определение гамильтонова пути в графе - student2.ru

 
  Определение гамильтонова пути в графе - student2.ru

11. Перегруппируем строки и столбцы матрицы R bтак, чтобы все нули были расположены под главной диагональю, а единицы - над ней: Получаем матрицу R c

Таким образом, получили три класса эквивалентности:,

- в первый класс входят вершины A1, A2, A5, A6;

- во второй - вершина A3;

- в третий - вершина A4.

Т.е. в гамильтоновом пути вершины A1, A2, A5, A6 предшествуют вершине A3 , которая, в свою очередь, предшествует вершине A4 . Всего возможно 4! ∙ 1! ∙ 1! = 24 вариантов следования вершин.

С учетом необходимости выполнения условий (4.4) определение гамильтонова пути становится достаточно простым делом. В данном примере получим единственный ГП: A1,A6,A5,A2,A3,A4 .

Алгоритм Фаулкса в общем случае не решает однозначно задачу определения Гамильтонова пути, он только частично упорядочивает множество вершин, снижая тем самым размерность решаемой задачи. В случае, когда в каждый класс эквивалентности входит только одна вершина, алгоритм Фаулкса определяет гамильтонов путь однозначно.

Определение связности графа

Неориентированный граф называется связным, если для любой пары вершин хijÎX существует хотя бы один маршрут, их соединяющий. В противном случае граф несвязан. Несвязный граф может быть единственным образом разбит на группы взаимосвязанных вершин (на связные компоненты) таким образом, что не существует маршрута, соединяющей какие-либо из вершин различных компонент.

Решим задачу определения связности графа с помощью элементов алгоритма Фаулкса.

Пусть дана матрица смежности R неориентированного графа G (матрица R симметрична относительно главной диагонали), имеющего n вершин. Необходимо определить, является ли этот граф связным. В случае, если граф несвязный, то требуется выделить из него все т связных подграфов G1, G2,…, Gm таких, что, например, из любой вершины подграфа G1 можно найти путь или маршрут, ведущий к любой другой вершине этого же подграфа, но нельзя найти путь или маршрут ни к одной вершине, не принадлежащей данному подграфу G1. Требуется определить, какие вершины входят в каждый из подграфов.

На основании матрицы смежности R получим матрицу достижимости не более чем за один шаг R1.

Затем, в соответствии с алгоритмом Фаулкса, найдем матрицу RN путем булевского перемножения матриц (RN = RN-1 Ä R1 ) до тех пор, пока не достигнем RN = RN-1. Полученная матрица RN является матрицей достижимости графа G. Она позволяет выявить связные подграфы и номера вершин, входящих в связные подграфы. Для этого необходимо в некоторой i - строке матрицы RN найти элементы rNij = 1, i, j = 1,…,n. Номера столбцов j, где rij = 1, и будут номерами вершин, входящих в связный подграф, включающий в себя i-ю вершину. Рассматривая последовательно все несовпадающие строки матрицы можно выявить все т связных подграфов исходного графа G.

В случае ориентированного графа, для решения задачи выделения связных подграфов, не связных между собой путем или маршрутом, необходимо перейти от ориентированного графа к неориентированному, заменив дуги неориентированными ребрами (звеньями). При возникновении параллельных звеньев оставить для дальнейшего рассмотрения только по одному звену, связывающему соответствующие вершины. В остальном процесс поиска связных подграфов не меняется.

Пример.

Пусть задана матрица R1 достижимости не более чем за один шаг неориентированного графа G , имеющего n = 8 вершин.

Определение гамильтонова пути в графе - student2.ru

Необходимо проверить граф на связность и выявить все связные подграфы.

1. Зададим начальный номер цикла вычислений: N = 1.

2. N= N +1 =2.

3. Производим умножение R1 Ä R1 = R2

Определение гамильтонова пути в графе - student2.ru .

4. Проверяем условие равенства R2 и R1. Они не равны. Переходим к п. 2.

2) N = 2 + 1 = 3.

3) Умножение R2 Ä R1= R3.

Определение гамильтонова пути в графе - student2.ru .

4) Проверяем условие равенства матриц R2 и R3. Так как они равны, то это означает, что путь длиной 2 - максимальный в данной графе, и дальнейшее перемножение матрицы не имеет смысла, так как мы будем получать одну и ту же матрицу. Найденная матрица R3 есть матрица достижимости исходного графа. Наличие нулей в полученной матрице показывает, что между соответствующими элементами отсутствует путь любойдлины и,следовательно, данный граф — несвязный.

5. Выбираем начальную вершину для выявления связных подграфов: i =1.

6. В строке i =1 выбираем все элементы r31j , равные единице (j=1,…,n). r311 = r312 = r317 = r318 = 1. Номера столбцов, в которых r3ij = 1 - это номера вершин первого связного подграфа, входящего в данный граф. То есть вершины 1, 2, 7, 8 образуют связный подграф G1 .

7. Определяем номер очередной вершины i = 1 + 1 = 2. Так как 2 ≤ 8, то на 8 (иначе на 9).

8. Проверим – входит ли данная вершина в найденные связные подграфы. Если среди вершин найденных связных подграфов есть данная вершина, то на 7, иначе на 6.

Так как среди вершин связного подграфа G1 есть вершина j=2, то возвращаемся к п.7.

7) i = 2 + 1 = 3. Так как 3 ≤ 8, то на 8.

8) Среди вершин связного графа G1 нет вершины j=3. Возвращаемся к п. 6.

6.) В строке 3 выбираем элементы, равные единице: r333 = r336 = 1. Следовательно, во второй связный подграф G2 входят вершины 3, 6.

7) Определяем номер очередной вершины i = 3 + 1 = 4. Так как 4 ≤ 8, то на 8.

8.) Среди вершин связных подграфов G1 и G2 нет вершины j = 4. Возвращаемся к п. 6.

6.) В строке 4 выбираем элементы, равные единице. r344 = r345 = 1. Следовательно, в третий связный подграф G3 входят вершины 4, 5.

7) i = 4 + 1 = 5. Так как 4 ≤ 8, то на 8.

8) Среди вершин связных графов G1, G2, G3 есть вершина j = 5. Переходим к п.7.

Аналогично проверяются вершины j = 6, 7, 8. Они входят в уже полученные выше подграфы.

9. Если проверены все вершины, то все связные подграфы найдены. Конец.

Таким образом в результате работы алгоритма найдены три связных подграфа:

G1 = {1, 2, 7, 8}; G2 = {3, 6}; G3 = {4, 5} (см. рисунок 4.2)

 
  Определение гамильтонова пути в графе - student2.ru

.

Рис 4. 2.

Наши рекомендации