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

алгоритмы / Метод ветвей и границ

.doc
Скачиваний:
113
Добавлен:
18.03.2015
Размер:
53.25 Кб
Скачать

Метод ветвей и границ

Специальным частным случаем метода поиска с ограничениями является метод ветвей и границ. История этого метода насчитывает уже более трех десятков лет. К идее метода ветвей и границ приходили многие исследователи, но Литтл с соавторами (Литтл, 1965) на основе указанного метода разработали удачный алгоритм решения задачи коммивояжера и тем способствовали популяризации подхода. С тех пор этот метод успешно применяется ко многим задачам, в том числе NP - полным задачам.

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

По сути своей он представляет собой определенным образом организованный перебор, в ходе которого исходная задача разбивается на множество подзадач, каждая из которых, в свою очередь, опять разбивается и т.д. Рассмотрим применение метода для решения задачи коммивояжера. Пусть в задаче n городов. Вначале разбиваем ее на n-1 подзадачу, первая из которых содержит все траектории с ребром (1, 2), вторая - с ребром (1, 3) и т.д. Далее, первое множество разбивается на n-2 подзадачи: первая обязательно содержит траектории с ребрами (1, 2) и (2, 3), вторая подзадача - с ребрами (1, 2) и (2,4) и т.д. Для каждой из подзадач вычисляются два числа, которые называются оценками или границами, нижняя граница - лучшее значение и верхняя - худшее значение стоимости решения.

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

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

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

C(a1, a2, …,ak) = C(a1, a2, …,ak-1) + C(ak), где C(ak)  0 – функция, определенная для всех ak.

Это свойство позволяет отбрасывать любое частичное решение в процессе поиска, если его цена больше цены ранее вычисленного решения, т.е. если C(a1, a2, …,ak) превосходит Cmin , то в (a1, a2, …,ak) не может содержаться оптимальное решение. В качестве кандидата на очередное ветвление берется множество с наименьшей оценкой C(ak), а если таких множеств несколько, то правила выбора могут быть самые разнообразные.

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

Пусть

C:=C (a1, a2, ..., ak) = C (a1, a2, ..., ak-1) + C (ak) - цена, где

C (ak) - функция, определенная для всех ak;

Алгоритм метода ветвей и границ

Cmin:=; /* максимально представимое число */

C:=0;

k:=1;

Вычислить S1; /* например, в качестве S1 можно взять A1 */

while k > 0 do

begin

while (Sk 0) and C < Cmin) do

begin /* продвижение */

В качестве ak взять наименьший элемент из Sk , удалив его из Sk ;

C:=C (a1, a2, ..., ak) = C (a1, a2, ..., ak-1) + C (ak);

if (a1, a2, ..., ak) является решением and (C < Cmin)

then begin Cmin:=C;

Хранить далее (a1, a2, ..., ak) как решение с наименьшей ценой

end

k:=k + 1

end

k:=k-1; /* возврат */

C:=C (a1, a2, ..., ak)

end

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

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

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

Рис.1

Рис. 2

Дерево поиска на рис. 1 является более предпочтительным, чем на рис.2.

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

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

Остовные деревья графа

Остовным деревом для связного неориентированного графа с n вершинами называется неориентированное дерево, содержащее все n вершин и (n-1) ребер графа. Таким образом, остовное дерево связывает все вершины графа и из каждой вершины можно попасть в любую другую. В полном графе в n вершинами имеется nn-2 остовных деревьев. Для одного и того же графа можно построить несколько остовных деревьев.

Основными задачами нахождения остовных деревьев графа являются:

  • Нахождение остовного дерева;

  • Нахождение минимального и максимального остовного дерева.

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

Рассмотрим алгоритмы нахождения остовного дерева минимальной стоимости. Стоимость остовного дерева определяется как сумма стоимостей его ребер.

Наиболее простым алгоритмом поиска остовного дерева минимального веса является алгоритм Прима. Он заключается в следующем:

  1. Вначале выбираем некоторую вершину v, остальные (n-1) вершины графа отмечаются как невыбранные.

  2. Определяются веса между выбранной вершиной v и всеми остальными невыбранными вершинами.

  3. Выбираем вершину с наименьшим весом до нее, фиксируем выбранное ребро и вес.

  4. Выбранную вершину исключаем из перечня невыбранных, число невыбранных вершин уменьшаем на 1.

  5. Пункты 1-4 повторяем до тех пор, пока не будут выбраны все вершины, т.е. (n-1) раз.

Алгоритм Крускала

Пусть имеется связный взвешенный граф с n вершинами. Построение остовного дерева минимального веса начинается с графа T=(V,0), имеющего только n вершин без ребер. Каждая вершина, таким образом, оказывается связанной только с самой собой. Построение дерева сводится к формированию набора связных компонент, постепенным объединением которых и формируется остовное дерево.

Упорядочим множество ребер в порядке их веса (стоимости). Выберем ребро с наименьшим весом C1 и включим в граф T. Теперь в графе T (n-1) компонент содержит только по одной вершине, одна компонента содержит две вершины и одно ребро. Выбираем следующее наименьшее ребро. Выбираем следующее наименьшее ребро. Если оно связывает две вершины из разных компонент, то это ребро добавляется в граф Т. Если же ребро связывает две вершины из одной компоненты, то такое ребро отбрасывается, так как его добавление в связную компоненту, являющуюся свободным деревом, приведет к образованию цикла. Когда все вершины графа будут принадлежать одной компоненте, построение остовного дерева минимального веса Т с (n-1) ребрами заканчивается.