Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методическое указание к выполнению курсовой работы

.pdf
Скачиваний:
34
Добавлен:
02.05.2014
Размер:
685 Кб
Скачать
☆

задача разбивается к нахождению гамильтоновых циклов в С2δ полученных подграфах, каждый из которых содержит вершину v1 степени 2.

Рассмотрим пример. Пусть задан граф G:

 

2

1

 

G:

v1

степень минимальной

4

 

 

4

5

 

3

 

1

1

 

 

1

 

 

 

7

 

Вершина v1 обладает минимальной степенью δ = 3, следовательно, число возможных подграфов для нахождения гамильтоновых циклов С23 = 3. Они имеют следующий вид.

G1: v1

1

 

2

1

G2:

 

v1

4

4

5

3

4

5

3

1

1

 

1

1

 

1

 

1

 

7

7

G3:

2

1

 

 

v1

 

 

4

4

5

 

3

 

1

1

 

7

В подграфе Gi выбирают вершину v1 степени 2, начиная с ребра е1 инцидентного v1 и смежной вершины наименьшей степени, строится гамильтонов цикл Cn из последовательности n простых цепей Ck = (e1…,ek), с учетом того, что vn+1 ≡ v1.

Ребро ек может присоединятся к Ск-1, если выполняются следующие условия:

31

1) vk+1 ≠ vj (j = 1,2,…k), если k ≠ n (присоединяется еще не рассматриваемая вершина).

2) Ск = Ск-1 U {ek} не разделяет оставшийся граф таким образом, что любые две вершины из оставшихся {vk+2,…,vn+1 ≡ v1} могут быть связаны цепью из ребер не ициндентных ни одной вершине (то есть полученный граф Gi должен быть связан на каждом шаге).

Если несколько ребер удовлетворяют условиям добавления к цепи в одной и той же вершине, то выбирается ребро наименьшей длины, а остальные ребра запоминаются.

Если ни одно ребро не удовлетворяет условиям 1 и 2 и не может быть присоединено к конечной вершине vk+1 цепи Ск, то такая цепь не является частью гамильтонова цикла и отбрасывается. При этом производится возврат в последнюю вершину произвольно выбранного ребра и исследуется новая цепь.

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

| С’к| + (n - k)si < |Сn|,

(6.1)

где si – длина кратчайшего ребра в подграфе Gi , на каждом шаге процедуры (для всех k = 1..n).

Рассмотрим подграф G1. Жирные ребра соответствуют ребрам искомого гамильтонова цикла. В скобках у вершины отмечают число ребер оставшихся для исследования (альтернативных вариантов).

32

 

G1: s1 = 1.

 

 

 

 

 

 

 

 

v1

4

δ=4

1

 

v1

4

1

 

10.

 

 

 

 

 

1

 

3

4

5

1

3

4

5

 

 

 

1

1

 

 

 

1

 

1

 

 

 

 

 

 

20.

(1)

 

 

 

 

δ=3

 

 

 

 

7

 

30.

 

7

 

40.

 

 

 

v1

4

1

v1

4

1

 

 

1

 

3

4

5

1

3

4

5

 

 

1

 

1

 

 

1

1

 

 

(1)

 

 

7

 

(1)

 

7

 

 

 

 

 

 

 

 

 

Длинна цикла С6 подграфа G1

равна 13. Рассмотрим альтернативу

 

(ветвление).

 

 

 

 

 

 

 

 

20а.

 

 

v1

4

1

 

 

 

 

 

 

 

 

 

 

 

 

1

3

4

5

1 1

7

Из ребер длинной 1, 4 и 5, согласно условию 2, можно добавить только 5.

Проверим условие | С’3| + (6 - 3)si < |Сn|, то есть (1+7+5)+3 =16 > 13.

Это означает, что второй (альтернативный) цикл гамильтона для этого подграфа будет длиннее первого.

Повторим все построения для подграфа G2: s2 = 1.

10.

v1

2

1

δ=3

20.

v1

2

1

 

 

1

3

4

5

 

1

3

4

5

 

 

1

1

 

 

 

1

1

 

 

δ=3

 

7

 

 

(1)

7

 

 

 

 

 

 

 

 

 

 

33

30.

 

 

 

 

40.

 

 

 

 

v1

2

 

1

 

v1

2

 

1

 

 

1

3

4

5

 

1

3

4

5

 

1

 

1

 

 

1

 

1

 

(1)

 

7

(1)

 

(1)

 

7

(1)

 

 

 

 

 

 

 

 

 

Длинна найденного гамильтонова цикла С6 для подграфа G2 равна 10. Рассмотрим ветвления.

30а.

v1

2

1

 

1

3

4

5

 

1

1

 

(1)

7

 

 

 

 

 

Оценим длинну цикла | С’3| + (6 - 3)si < |Сn|, то есть (1+1+3)+3 =7 < 10.

Присоединим еще одно ребро.

40а.

v1

2

1

 

 

 

 

 

1

3

4

5

1 1

(1)

7

Проверим условие | С’4| + (6 - 4)si < |Сn|, то есть (1+1+3+4)+2 = 13 > 10,

дальнейшие построения - неэффективны. Вернемся к более ранней альтернативе.

20б.

v1

2

1

 

 

 

 

 

 

1

3

4

5

1 1

(1)

7

Оценим длинну строимой цепи | С’2| + (6 - 2)si < |Сn|, то есть (1+7)+4 = 12 > 10.

34

Таким образом минимальный гамильтонов цикл во втором подграфе имеет длинну равную 10.

Рассмотрим подграф G3: s3 = 1.

10.

2

δ=4

1

δ=3

20.

2

1

 

v1

v1

 

 

4

3

4

5

 

4

4

5

 

 

 

3

 

1

 

1

 

 

1

1

 

Оценим

 

7

 

длинну

строимой

 

7

цепи |

 

 

 

 

 

С’2| + (6 - 2)si < |Сn|, то есть (2+5)+4 = 11 > 10.

Кратчайшим гамильтоновым циклом графа G является цикл длиной равной 10, найденный в подграфе G2.

Рассмотренный метод хорошо работает для небольших графов. Реализация метода на ЭВМ затруднена проверкой условия 2, которое очень просто проверяется графически. Для решения задачи о коммивояжере на ЭВМ эффективно используется метод ветвей и границ.

3) Задача о кратчайшем пути,

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

Формулируется задача о кратчайшем пути следующим образом.

Дан неориентированный граф G(V, E). Каждому ребру этого графа приписано некоторое число l (e) ≥ 0, называемое длиной ребра. При это любая цепь будет характеризоваться длиной, определяемой следующей формулой:

l(µ) = ∑l(e) .

e µ

35

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

Наиболее простым случаем является задача отыскания кратчайшего пути в графе с ребрами единичной длины. Одним из методов решения этой задачи является метод индексов. Общее правило для нахождения кратчайшего пути в графе состоит в том, что каждой вершине vi приписывают индекс di, равный длине кратчайшего пути из данной вершины в конечную вершину. Приписывание индексов вершинам в случае графа с ребрами единичной длины производится в следующем порядке:

•конечной вершине vn приписывается индекс 0;

•всем вершинам, из которых идет ребро в конечную вершину, приписывается индекс 1;

•всем вершинам, еще не имеющим индексов, из которых идет ребро в вершину с индексом di, приписывается индекс di+1.

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

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

36

• Каждая вершина vi помечается индексом di . первоначально конечной вершине vn приписывается индекс dn. Для остальных вершин полагаем di =

∞ (i ≠ n).

• Ищем такое ребро (vi, vj), для которого di – dj > l (vi, vj), заменяем индекс di индексом d’i, который определяется по правилу:

d’i = dj + l (vi, vj).

• Процесс замены индексов продолжаем до тех пор, пока есть хотя бы одна дуга, для которой можно уменьшить di.

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

Таблица 5.1

Рассматриваем

Условие обновления

Способ обновления

Новое

ые

индекса

индекса

значение

ребра

 

 

 

(v3, v6)

d3 > d6 + l (v3, v6)

d’3 = d6 + l (v3, v6)

d3 = 2

(v5, v6)

d5 > d6 + l (v5, v6)

d’5 = d6 + l (v5, v6)

d5 = 3

(v2, v3)

d2 > d3 + l (v2, v3)

d’2 = d3 + l (v2, v3)

d2 = 5

(v4, v3)

d4 > d3 + l (v4, v3)

d’4 = d3 + l (v4, v3)

d4 = 7

(v4, v5)

d4 > d5 + l (v4, v5)

d’4 = d5 + l (v4, v5)

d4 = 4

(v1, v2)

d1 > d2 + l (v1, v2)

d’1 = d2 + l (v1, v2)

d1 = 9

(v1, v4)

d1 > d4 + l (v1, v4)

d’1 = d4 + l (v1, v4)

d1 = 6

Отметим два свойства, которыми будут обладать приписанные вершинам индексы:

37

•Пусть (vs, vk) произвольное ребро. Для него обязательно будет выполняться условие ds – dk ≤ l (vs, vk), поскольку в противном случае индекс dk можно было бы уменьшить.

•Пусть vp – произвольная вершина. При рассмотрении процесса приписывания индексов индекс dp монотонно уменьшается. Пусть vq – последняя вершина, используемая при уменьшении индекса dp. Тогда dp = dq + l (vp, vq). Следовательно, для произвольной вершины vp с индексом dp всегда найдется вершина vq, соединенная ребром с vp, такая, что

справедливо равенство dp – dq = l (vp, vq).

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

 

d2 = ∞

 

d3 = ∞

 

d6 = 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

v2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v6

 

а)

 

 

 

 

 

 

v3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

5

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v1

 

 

 

 

v4

 

 

 

 

v5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

d1 = ∞

 

d4 = ∞

 

d5 = ∞

 

d2 = 5

 

d3 = 2

2

d6 = 0

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

v2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

б)

 

 

 

 

 

 

 

v3

 

 

 

 

v6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

v5

 

 

 

v1

 

 

 

 

 

v4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

d1 = 6

 

d4 = 4

 

d5 = 3

Рис. 5.1

Рассмотрим алгоритмы отыскания кратчайшего пути, которые лучше поддаются автоматизации и могут быть реализованы в виде программ для ЭВМ. Длину ребра между i-ой и j-ой вершинами l (vi, vj) будем обозначать

dij.

38

Алгоритм Беллмана - Форда.

Допустим, вершина v1 является начальной и необходимо найти длину пути между вершиной v1 и всеми другими вершинами графа G. Для упрощения примем dij = ∞, если между вершинами vi и vj графа нет ребра. Основная идея алгоритма состоит в следующем: сначала найти длины кратчайших путей при условии, что пути содержат не более одного ребра, затем – длины кратчайших путей при условии, что пути содержат не более двух ребер и т.д. Кратчайший путь при условии, что он содержит не более h

ребер, будем называть кратчайшим ≤ h путем.

Пусть

Di(h) – длина кратчайшего

≤ h пути от вершины v1 к

вершине vi.

Будем считать, что D1(h) = 0

для всех h. Вначале Di(0) = ∞ для

всех i ≠ 1. При каждом последующем h > 0 для всех i ≠ 1:

Di (h +1) = min [Dj (h) +dij ]

j

Если n – число вершин графа, то путь может содержать не более (n –

1)дуг, а алгоритм, соответственно, не более (n – 1) итераций.

Вкачестве примера рассмотрим отыскание кратчайших путей из вершины v1 во все остальные вершины графа G, приведенного на рис. 5.2. В данном примере n = 5, hmax = 4. Последовательность решения и итоговое дерево кратчайших путей графа также приведены на рис. 5.2.

39

а) исходные данные;

б) кратчайшие пути (≤ 1);

в) кратчайшие пути (≤ 2);

г) кратчайшие пути (≤ 3);

д) кратчайшие пути (≤ 4).

 

Рис. 5.2

 

Алгоритм Дийкстра.

Объем вычислений у алгоритма Дийкстра даже в худшем случае меньше, чем у алгоритма Беллмана-Форда. Основная идея алгоритма состоит в отыскании кратчайшего пути в порядке возрастания длины пути.

Будем считать, что каждая вершина vi имеет метку Di, означающую длину кратчайшего пути в эту вершину из вершины v1. В процессе отыскания кратчайшего пути метка вершины может изменяться. Когда метка становится неизменной, будем считать, что вершина окончательно помечена. Множество окончательно помеченных вершин обозначим P. Вершина, которая на очередном шаге будет добавлена к множеству P, является ближайшей к вершине v1 среди всех вершин, не входящих в

40