Главная  Полное построение алгоритма 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [ 41 ] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

{3, 5} в дереве отработана. Тогда следующей целью может быть ветвление из вершины {3, 5} в надежде найти тур со стоимостью в пределах 49с<62.

В основных чертах блок-схема этого алгоритма ветвей и границ показана на рис. 3.4.5. Вскоре мы дополним эту схему рядом важных

йля текущей X


Шщистзат лерементк

ГГравевение С Устатбкп корня, X=R

BbUfoppedpe {к, I) 8т слеВукщега Ветбмния

ПроцЕса ВегпВ/1еяия Устанобкп Вершты Y Вычисление ш(У) .


Выбор „ следующей ВершшыХ

Если MV)<Zn, полагаем.

Рис 3.4.5. Блок-схема алгоритма ветвей и границ.

деталей. Здесь используются следующие обозначения. Буква X обозначает текущую вершину на дереве поиска, а w (X) - соответствующую нижнюю границу. Вершины, следующие непосредственно за X, назовем F и F; они выбираются ветвлением по некоторому ребру {k, I). Символ го обозначает стоимость самого дешевого тура, известного на данный момент. В начальный момент го=схэ. Советуем хорошо изучить эту блок-схему.



Теперь раскроем более детально содержание некоторых блоков этой схемы.

Блок 1. Установление начальных значений переменных, или инициализация, не представляет труда; детали оставлены в качестве упражнения.

Блок 2. Первое приведение - это непосредственная реализация описанной ранее процедуры; детали оставляем в качестве упражнения.

Блок 3. Выбор следующего ребра ветвления {k, I) определяет множества F и F, непосредственно следующие за текущим X. Ребро (k, I) нужно выбирать так, чтобы попытаться получить большую по величине нижнюю границу на множестве Y={k, 1), что облегчит проведение оценки для множества Y. Обычно предпочтительнее провести оценку для Y, так как размер этого множества и соответствующая ему матрица стоимостей обычно больше, чем у Y (из матрицы для Y вычеркнуты строка k и столбец /). Можно надеяться также, что Y с большей вероятностью содержит оптимальный тур.

Как применить эти идеи к выбору конкретного ребра ветвления (к, /)? В приведенной матрице стоимостей С, связанной с X, каждая строка и столбец имеют хотя бы по одному нулевому элементу (если нет, то С не полностью приведена). Можно предположить, что ребра, соответствующие этим нулевым стоимостям, будут с большей вероятностью входить в оптимальный тур, чем ребра с большими стоимостями. Поэтому мы выберем одно из них. Но какое? Пусть ребро (t, /) имеет Cij=0 в С. Мы хотим, чтобы у Y={i, j} была как можно большая нижняя граница. Вспоминая метод вычисления нижней границы для (3, 5} в нашем примере, мы видим, что для Y эта граница задается в виде

ш(К)=ш(Х)+(наименьшая стоимость в строке i, не включая Cj,-)+ -- (наименьшая стоимость в столбце /, не включая с).

Следовательно, из всех ребер (г, /) с Сг,=0 в текущей матрице С мы выбираем то, которое дает наибольшее значение для w{Y). Пусть это будет ребро {k, I).

Поэтому более подробное описание выбора, представленного блоком 3, имеет следующий вид:

Шаг 1. Пусть S - множество ребер (t, /), таких, что сг;=0 в текущей матрице стоимостей С.

Шаг 2. Положим Dij равным наименьшей стоимости в строке i, исключая сц, плюс наименьшая стоимость в столбце исключая Сц. Вычисляем Dij для всех (г, j)S.

Шаг 3. Выбираем следующее ребро ветвления {к, I) из условия

Dli= шах Dij.



Рассмотрим опять задачу с пятью городами, изображенную на рис. 3.4.1. Из приведенной матрицы С видно, что первое значение X, корень R, имеет w{X)=47. Применяя подалгоритм, описанный выше, находим наше первое ребро ветвления следующим образом:

Шаг 1. S={(1, 2), (2, 1), (3, 5), (4, 5), (5, 3), (5. 4)}

Шаг 2. Dia=2+1=3 D2i=12+3=15 Гз,=2+0=2 i>45=3+0=3 D,3=0+12=12 Dg4=0+2=2

Шаг 3. Выбираем ребро {k, l)={2, 1), так как Dgi - это максимальный элемент множества {Dtj}.

Блок 4. Определяем вершину F, следующую за X, точно так же, как мы делали раньше.

В рассматриваемом примере X=R и Y={2, 1}, т. е. это множество всех туров, не содержащих ребро (2, 1). Вычисляем нижнюю границу w(Y) так же, как в блоке 3, т. е.

w{Y) = w{X) + Dh и w{{2, 1}) = 47+15 = 62.

Блок 5. Вершине Y, следующей за X, соответствует подмножество туров из X, содержащих то ребро {k, 1), которое выбрано в блоке 3. В рассматриваемом примере Y={2, 1). При вычислении w{Y) необходима известная осторожность. Подробный подалгоритм имеет следующий вид:

Шаг 1. Из С исключаем строку k и столбец /.

Шаг 2. Все туры множества, представленного вершиной Y, содержат сколько-то (быть может, ни одного) из ранее выбранных ребер, помимо ребра (k, I). Ребро {k, I) будет или изолировано от этих других ребер, или будет частью пути, включающего некоторые или все эти ребра. Пусть р и q - начальный и конечный города этого пути. Возможно, что p=k и (или) q=l. Положим Сдр=(х>. Эта мера предохраняет от выбора ребра (<7, р) в качестве последующего для Y, а тем самым предохраняет от формирования замкнутого цикла длины меньше Л. Такие циклы, конечно, не разрешены при построении тура. Есть ли какие-то случаи, в которых мы не полагаем

Шаг 3. Приводим рассматриваемую матрицу С. Пусть h будет равно

сумме констант приведения. Шаг 4. Вычисляем w{Y) по формуле w{Y)=w{X)-\rh.

Возвращаясь к примеру, вычеркиваем строку 2 и столбец 1 из матрицы С, показанной на рис. 3.4.3. Так как ребро (2, 1) - един-



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [ 41 ] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117]

0.002