Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Алгоритм выделения эйлерова цикла в связном мультиграфе с четными степенями вершин↑ ⇐ ПредыдущаяСтр 5 из 5 Содержание книги
Поиск на нашем сайте
1) Выделим из G цикл m1. (так как степени вершин четны, то висячие вершины отсутствуют). Положим l =1, G ¢= G. 2) Удаляем из G ¢ ребра, принадлежащие выделенному циклу m1. Полученный псевдограф снова обозначаем как G ¢. Если в G ¢ отсутствуют ребра, то переходим к шагу 4. Если ребра есть, то выделяем из G ¢ цикл m l +1 и переходим к шагу 3. 3) Присваиваем l:= l +1 и переходим к шагу 2. 4) По построению выделенные циклы содержат все ребра по одному разу. Если l:=1, то искомый Эйлеров цикл найден (конец работы алгоритма). В противном случае находим циклы, содержащие хотя бы по одной общей вершине (в силу связности графа это всегда можно сделать). Склеиваем эти циклы. Повторяем эти операции, пока не останется один цикл, который является искомым. Пример. Найдем Эйлерову цепь в неориентированном графе G, изображенном на рис. 10. Прежде, чем приступать к нахождению Эйлеровой цепи, необходимо проверить степени вершин графа G − согласно утверждению 2, для существования Эйлеровой цепи, необходимо и достаточно, чтобы в графе G ровно 2 вершины нечетной степени.
Рис. 10.
В рассматриваемом графе нечетные степени имеют вершины v 3 и v 1 (степень этих вершин равна 3). Соединяя эти вершины фиктивным ребром так, как показано на рис. 11, получаем граф G ¢:
Рис. 11.
Поскольку в конечном итоге будет получена цепь, то очевидно, что началом и концом этой цепи будут вершины с нечетными степенями. Поэтому, следуя описанному выше алгоритму, будем циклы m i так, чтобы хотя бы один из них начинался или кончался на вершинах v 3 или v 1. Пусть цикл m1 составят ребра, проходящие через следующие вершины: v 3 v 4 v 7 v 6 v 1 v 2 v 3. Согласно алгоритму, удаляем из G ¢все ребра, задействованные в цикле m1. Теперь граф G’ будет таким, как показано на рис. 12. Составляем следующий цикл m2: v 4 v 5 v 6 v 2 v 5 v 7 v 4. Граф G ¢ после удаления ребер, составляющих цикл m2, изображен на рис. 13.
Очевидно, что последний цикл m3 будет состоять из v 3 v 5 v 1| v 3, где последнее ребро, соединяющее вершины v 1 и v 3 – фиктивно. После удаления ребер, составляющих цикл m3, в графе G ¢ не останется ни одного ребра. Теперь по общим вершинам склеиваем полученные циклы. Поскольку m1 и m2 имеют общую вершину v 4, то, объединяя их, получим следующий цикл: v 3 v 4 v 5 v 6 v 2 v 5 v 7 v 4 v 7 v 6 v 1 v 2 v 3. Теперь склеим получившийся цикл с циклом m3: v 3 v 4 v 5 v 6 v 2 v 5 v 7 v 4 v 7 v 6 v 1 v 2 v 3 v 5 v 1| v 3. Удаляя фиктивное ребро, получаем искомую Эйлерову цепь: v 3 v 4 v 5 v 6 v 2 v 5 v 7 v 4 v 7 v 6 v 1 v 2 v 3 v 5 v 1. Минимальное остовное дерево Найти минимальное остовное дерево в неориентированном нагруженном графе. Алгоритм выделения минимального остовного дерева в неориентированном нагруженном графе G 1) Выберем в графе G ребро минимальной длины. Вместе с инцидентными ему двумя вершинами оно образует подграф G 2 графа G. Положим i:=2. 2) Если i = n (G), то задача решена и Gi – искомое минимальное остовное дерево графа G. Иначе переходим к шагу 3). 3) Строим граф Gi +1. Для этого добавим к графу Gi новое ребро минимальной длины из оставшихся, которое инцидентно какой-либо вершине графа Gi и одновременно вершине, не содержащейся в Gi. Вместе с этим ребром включаем в Gi +1 и эту инцидентную ему вершину. Присваиваем i:= i +1 и переходим к шагу 2). Пример. Найдем минимальное остовное дерево в неориентированном нагруженном графе, изображенном на рис.14.
Рис.14.
Обозначим ребро, соединяющее вершины vi и vj через xij. Для удобства использования приведенного выше алгоритма решения поставленной задачи, составим матрицу длин ребер. В рассматриваемом графе количество вершин n= 8, следовательно, матрица длин ребер графа G будет иметь размерность 8×8 и выглядеть следующим образом: Согласно приведенному выше алгоритму, выбираем ребро минимальной длины (выбираем среди элементов матрицы C (G), минимальное − это c 47=1) и вместе с инцидентными ему двумя вершинами относим к графу G 2. Таким образом, . Длина дерева G 2 будет равна l (G 2)= c 47=1. Поскольку , продолжаем работу алгоритма. По четвертой и седьмой строкам ищем минимальное число (за исключением использованной единицы) − ребро минимальной длины, инцидентное либо вершине v 4, либо v 7. Выбираем ребро x 46 с длиной c 46=3 и вместе с вершиной v 6 добавляем к графу G 2, обозначая его теперь как G 3: , при этом l (G 3)= c 47+ c 46=1+3=4. Аналогично находим графы: , ; , ; , ; , ; , . Поскольку i =8= n (G), работа алгоритма заканчивается. Таким образом, искомое минимальное остовное дерево графа G − граф G 8, изображенный на рис. 15, длина которого равна 22. Рис.15.
Задача о коммивояжёре Найти в нагруженном неориентированном графе гамильтонов цикл минимального веса. Эта задача имеет практическую интерпретацию, благодаря которой и получила своё название: коммивояжёр (бродячий торговец) должен выйти из первого города, посетить по разу в неизвестном порядке города 2,3.. n и вернуться в первый город. Стоимости проезда между городами известны. В каком порядке следует объезжать города, чтобы замкнутый путь (тур) коммивояжера был наименее затратным? Сформулируем задачу в терминах теории графов, введя следующие обозначения: пусть D =[ V, X ] – полный ориентированный граф и f: X ® - весовая функция, V= { v1, v2,…, vn } – множество вершин, X – множество дуг, C= { cij }, i, j =1,2… n – весовая матрица данного ориентированного графа, то есть сij = f (vi,vj), причем для любого i справедливо cii =¥. Требуется найти простой остовной ориентированный цикл (или «цикл коммивояжёра») минимального веса. Следует заметить, что требование полноты ориентированного графа (наличие дороги из любого города в любой) можно опустить. Однако в этом случае гамильтонов цикл может и не существовать (по теореме, для его существования достаточна полнота орграфа). Следовательно, описываемый метод ветвей и границ приведёт к полному перебору всех вариантов незаконченных циклов прежде, чем станет очевиден факт отсутствия решения. Очевидно, cij следует трактовать как стоимость проезда из города i в город j. Допустим, что добрый мэр города j издал указ выплачивать каждому въехавшему в город коммивояжеру $5. Это означает, что любой тур подешевеет на $5, поскольку в любом туре нужно въехать в город j. Но поскольку все туры равномерно подешевели, то прежний минимальный тур будет и теперь стоить меньше всех. Добрый же поступок мэра можно представить как уменьшение всех чисел j -го столбца матрицы M на 5. Если бы мэр хотел спровадить коммивояжеров из j -го города и установил награду за выезд в размере $10, это можно было бы выразить вычитанием 10 из всех элементов j -й той строки. Это снова бы изменило стоимость каждого тура, но минимальный тур остался бы минимальным. Итак, доказана следующая лемма. Вычитая любую константу из всех элементов любой строки или столбца матрицы C, мы оставляем минимальный тур минимальным. В этой связи введем следующие термины. Пусть имеется некоторая числовая матрица. Привести строку этой матрицы означает выделить в строке минимальный элемент (его называют константой приведения) и вычесть его из всех элементов этой строки. Очевидно, в результате в этой строке на месте минимального элемента окажется нуль, а все остальные элементы будут неотрицательными. Аналогичный смысл имеют слова «привести столбец матрицы». Привести матрицу по строкам означает, что все строки приводятся. Аналогичный смысл имеют слова «привести матрицу по столбцам». Приведение матрицы означает сначала приведение этой матрицы по строкам, а затем по столбцам. Если с помощью приведённой матрицы удастся построить такую последовательность переходов по городам (по вершинам графа), которым соответствует последовательность нулевых элементов приведенной матрицы, то ясно, что для этой матрицы мы получим минимальный тур. Но он же будет минимальным и для исходной весовой матрицы С, только для того, чтобы получить правильную стоимость тура, нужно будет прибавить все константы приведения. Таким образом, сумма констант приведения играет роль оценки снизу для стоимости всех туров. Весом элемента матрицы называют сумму констант приведения матрицы, которая получается из данной матрицы заменой обсуждаемого элемента на ¥. Следовательно, слова «самый тяжёлый нуль в матрице» означают, что в матрице подсчитан вес каждого нулевого элемента, а затем фиксирован нуль с максимальным весом. Продемонстрируем теперь метод ветвей и границ для решения задачи о коммивояжёре. Пусть требуется найти легчайший простой остовной ориентированный цикл в полном взвешенном ориентированном графе на пяти вершинах, со следующей весовой матрицей C:
Верхняя строка и левый столбец, выделенные затемненным фоном, содержат номера вершин графа; символ ¥, стоящий на главной диагонали означает отсутствие дуг-петель; кроме того, символ ¥ здесь и всюду означает «компьютерную бесконечность», то есть самое большое из возможных в рассмотрении чисел; считается, что в сумме ¥ с любым числом даёт ¥. Обозначим за Г множество всех обходов коммивояжера (т. е. всех простых ориентированных остовных циклов). Поскольку граф – полный, это множество заведомо не пусто. Сопоставим ему число j(Г), которое будет играть роль значения на этом множестве оценочной функции: это число равно сумме констант приведения данной матрицы весов дуг графа и является оценкой снизу для стоимости минимального тура коммивояжёра. Приведённую матрицу весов данного графа следует запомнить, обозначим ее через С 1. Подсчитаем j(Г). Для этого выполним приведение матрицы весов. Сначала – по строкам:
Теперь − по столбцам:
Сумма констант приведения j(Г)=4+4+2+1+2+1=14. Обозначим полученную матрицу через С 1 и найдём в ней самый тяжёлый нуль. Заметим, что замена нулевого элемента на ¥ приводит к изменению лишь двух слагаемых суммы констант приведения j(Г) – по одному при приведении строк и столбцов. Поэтому вес нуля можно определить суммированием наименьших элементов его строки и столбца. Вообще нуль в клетке (i, j) приведённой матрицы означает, что цена перехода из города i в город j равна 0. А если мы не пойдём из города i в город j? Тогда все равно нужно въехать в город j за минимальную цену, указанные в j -том столбце; и все равно надо будет выехать из города i за минимальную цену, указанную в i -той строке. А это и есть оценка нуля. Например, вес нуля в первой строке и четвёртом столбце складывается из минимума по первой строке, равного 4 (c 1,2= c 1,3=4), и минимума по четвёртому столбцу, равного 0 (c 5,4=0), без учета самого c 1,4. Итак, запишем приведённую матрицу еще раз, указывая рядом с каждым нулем его вес:
Самым тяжёлым оказывается нуль в клетке (1,4). Разобьём множество Г на две части: множество (все циклы, проходящие через дугу (1,4)) и (все циклы, не проходящие через дугу (1,4)). Такое ветвление определяет необходимость выбора одного из этих вариантов. Множеству соответствует матрица С 1,1, полученная вычёркиванием соответствующих строки (строку 1) и столбца (столбец 4). У оставшихся строк и столбцов сохраним их исходные номера. Разумеется, вместе с вычёркиванием строки и столбца, в матрице надо заменить на ¥ числа в определённых клетках так, чтобы не получалось коротких циклов (длиной меньше n). В данном случае из города 4 мы уже не можем проехать в город 1, поэтому в клетке (1,4) ставим знак ¥.
Сумма констант приведения матрицы С 1,1 здесь равна 1, поэтому j(Г{(1,4)})=j{1,4}=14+1=15. Сопоставим результат j(Г{( i , j)}) множеству Г{( i , j)}, (в нашем случае Г{(1,4)}). Множеству (в нашем случае ), в свою очередь, соответствует другая матрица – С 1,2, полученная заменой на ¥ элемент с 1,4 в матрице С 1:
Сумма констант последнего приведения равна 4, так что . Теперь выберем между множествами и то, на котором минимальна функция j. В нашем случае из множеств, которому соответствует меньшее из чисел j(Г{(1,4)})=15 и . Поэтому дальнейшей разработке подвергнется множество Г{(1,4)}. Итак, выделена определенная дуга (1,4) графа и построены новые матрицы, к которым, очевидно, можно применить описанную выше процедуру. При каждом таком повторном применении будет фиксироваться очередная дуга графа, которая в конечном итоге войдёт в искомый гамильтонов цикл (цикл коммивояжёра), если данная ветвь будет продолжена до конца и иметь минимальный вес. В матрице С 1,1 подсчитаем веса нулей (веса нулей указаны в скобках):
Самым тяжёлым является нуль с номером (4,3), так что теперь следует рассматривать множества и . Обратимся к первому из них. Поскольку, вычеркнув строку 4 и столбец 3 в матрице С 1,1, нужно также заменить на ¥ числа в определённых клетках так, чтобы не получалось коротких циклов (длиной меньше n), то в клетке с номером (3,1) надо поставить символ ¥. Получим матрицу С 1,1,1:
Для оценочной функции . Матрица С 1,1,2 для множества :
Оценочная функция . Следовательно, дальнейшей разработке подлежит . «Взвешиваем» нули в матрице С 1,1,1:
Поскольку все нули имеют одинаковый вес, выберем любой из них; для определённости – нуль, стоящий в клетке (2,1). Теперь речь пойдёт о множествах и . Как и раньше, вычёркивая строку 2 и столбец 1 в матрице С 1,1,1, нужно также заменить на ¥ числа в определённых клетках так, чтобы не получалось коротких циклов (длиной меньше n). Так в клетке с номером (3,2) окажется символ ¥.
Получаем для оценочной функции . Для множества матрица такова:
Для оценочной функции . Получилось, что для дальнейшей разработки можно брать любое из множеств и . Но в первом случае уже получена матрица размером 2´2. Её нулевые клетки дают те дуги, которые с найденными ранее составляют обход коммивояжёра, причём вес этого обхода равен значению оценочной функции – 18. Вот этот обход: (1,4)(4,3) (3,5) (5,2) (2,1) или 1®4®3®5®2®1 Найденный путь коммивояжёра является оптимальным, потому что значения оценочной функции на всех оборванных ветках (на границах) больше либо равны стоимости этого пути. Возможно, что оптимальный цикл будет не единственным. При ином варианте выборов по ходу разбиений можно было получить и другой оптимальный путь коммивояжёра, однако стоимость этих путей будет одинакова.
3. Задания для самостоятельного решения 1. С помощью матрицы смежности найти компоненты сильной связности ориентированного графа D.
2. С помощью алгоритма фронта волны найти расстояния в ориентированном графе D: диаметр, радиус и центры.
Примечание: самый длинный путь в графе найти при помощи алгоритма фронта волны. 3. Найти минимальный путь в нагруженном графе по методу Форда-Беллмана.
4. Найти Эйлерову цепь в неориентированном графе.
5. Найти минимальное остовное дерево в неориентированном нагруженном графе.
6. Методом ветвей и границ найти оптимальный путь коммивояжёра при следующей матрице стоимости.
Расстояние равно 15 |
Ответ: 1® 2®6 ®5® 4® 3 ®1, Расстояние равно 36 |
Ответ: 1® 3 ®2 ®4® 6® 5 ®1, Расстояние равно 11 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
а) | б) | в) |
СПИСОК ЛИТЕРАТУРЫ
1. Акимов О.Е. Дискретная математика: логика, группы, графы. -М.: Лаборатория базовых знаний, 2003. - 352 с.
2. Новиков Ф.А. Дискретная математика для программистов. -СПб: Питер, 2001. – 304 с.
3. Романовский И.В. Дискретный анализ: Учебное пособие для студентов, специализирующихся по прикладной математике и информатике. – 3-е изд., перераб. и доп. – СПб.: Невский Диалект, БХВ-Петербург, 2003. –320с.
4. Яблонский С.В. Введение в дискретную математику. -М.: Наука, 1986.- 384с.
5. Новиков Ф.А. Дискретная математика для программистов. – -СПб: Питер, 2001. - 304с.
6. Гаврилов Г.П., Сапоженко А.А. Задачи и упражнения по курсу дискретной математики. -М.: Наука, 1992. – 408 с.
7. Бронштейн Е.М., Хазанкин В.Г. Методические указания для самостоятельной работы по основам теории графов./ -Уфа, 1989. - 24 с.
8. Хабиров С.В., Дворяшина Т.П. Упражнения и задачи по основам теории графов: Методические указания / Уфимск. гос. авиац. техн. ун-т. -Уфа, 1994. - 36с.
| Поделиться: |
Познавательные статьи:
Последнее изменение этой страницы: 2016-06-28; просмотров: 415; Нарушение авторского права страницы; Мы поможем в написании вашей работы!
infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.225.98.39 (0.01 с.)