[Оглавление] | [<< страница] | [>>страница] |
Алгоритм метода ветвей и границ похож на алгоритм с возвратом, он также использует дерево решений и применим для широкого круга дискретных комбинаторных задач. Если алгоритм с возвратом направлен на нахождение одного или нескольких решений, удовлетворяющих определённым условиям, то алгоритмы ветвей и границ ориентированны преимущественно на оптимизацию.
В дереве решений для каждого узла (вершины) определяется некоторая функция стоимости. Цель – найти конфигурацию, на которой функция стоимости дос-тигает максимального или минимального значения. Алгоритмы ветвей и границ, как правило, довольно сложны. Для сокращения процесса поиска оптимального решения используется метод поиска, основанный на правилах вычёркивания ветвей. Сущность метода ветвей и границ рассмотрим на примере решения задачи бивалентного линейного программирования.
Пример.
Имеются единичные ресурсы х1, х2,…хn. Применение каждого ресурса хi даёт прибыль сj. Необходимо выбрать такие ресурсы хi, которые обеспечивают наибольшую прибыль
maxP=max∑cjxj при ограничениях
∑aijxj ≤bi, i=1,2,…m и xj=0 или 1, j=1,2,…n.
Построим двоичное дерево решений следующим образом. Ветви, отходящие от корня (узла нулевого уровня), будут соответствовать выбору ресурса x1: левая ветвь — ресурс выбран (x1 = 1), правая ветвь — ресурс не выбран (x1 = 0). Аналогично левые ветви, исходящие из узлов (к - 1)-го уровня, соответствуют выбору ресурса Хk (хk = 1), к = 1,2,...,n, а правые — (хk = 0). В результате получаем идеально сбалансированное дерево высоты n с 2n листьями.
Поиск оптимального решения осуществляется обходом дерева. Для конкретности рассмотрения примем порядок левого нисходящего обхода Preorder. Это означает, что сначала двигаемся по левым поддеревьям вниз до конца, затем возвращаемся на предыдущий уровень и двигаемся по правым поддеревьям. Каждому узлу к-го уровня (к = 0,1,2,...,n) соответствует некоторый k-мерный вектор с нуль-единичными элементами, который позволяет однозначно вычислить значение прибыли для этого узла
Pk= ∑cjxj
и определить, удовлетворяются ли условия
∑aijxj≤bi , i=1,2,…m.
Корню дерева (к = 0) соответствуют отсутствие ресурсов и нулевая прибыль Р = 0. При обходе по мере посещения узлов дерева, удовлетворяющих нашим ус-ловиям, выбирается максимальное текущее значение прибыли Рi, и запоминается соответствующий ей к-мерный вектор Хk.
Пусть мы находимся в некотором промежуточном узле к-го уровня, в котором удовлетворяются наши условия. Прибыль в этом узле составляет:
Pk=∑cjxj
что соответствует выбранной комбинации ресурсов х1,х2,…хk.
Целесообразно ли двигаться дальше вниз от этого узла? Поскольку движение по правой ветви вниз на один уровень не приводит к выбору нового ресурса (хk+1=0), то и значение прибыли не изменяется. Поэтому вопрос касается только движения вниз по левой ветви.
Если бы теперь мы выбрали все оставшиеся ресурсы (хk+1 = 1, …,хn=1), т.е. двигались бы до конца по левым ветвям, то прибыль увеличилась бы и составила:
Pk+m=∑cjxj+∑cm
Это максимально возможное значение прибыли при движении от рассматриваемого узла. Поэтому движение вниз от этого узла имеет смысл только тогда, когда Рk+m > Рt , в противном случае необходимо возвращаться назад.
Таким образом, текущее максимальное значение прибыли Pt он деляет границу движения вниз от данного узла, и ветви рассматриваемого узла вычеркиваются, т.е. от дальнейшего обхода исключаются все узлы-потомки.
Если же Рk+m> Рt, то обход дерева по левым поддеревьям продолжается. Придя в следующий узел, т.е. выбрав хk+1=1, проверяем, удовлетворяются ли условия
∑aijxj≤bi , i=1,2,…m.
Если да, то вычисляем новое значение прибыли, при необходимости обновляем текущее максимальное значение прибыли Рt, и продолжаем движение вниз по левым поддеревьям по рассмотренному алгоритму. Если эти условия не удовлетворяются или мы уже обработали конечный узел (лист) поддерева, то возвращаемся назад на один или несколько уровней и начинаем обход правого поддерева. Нужно отметить, что движение по правой ветви вниз на один уровень всегда осуществляется безусловно, так как при этом значение прибыли не изменяется и не нарушаются наши условия.
По завершении обхода как результат получаем искомое максимальное значение прибыли max Р = Рt, и оптимальный вектор X*, у которого единичные элементы соответствуют выбранным ресурсам.
[Оглавление] | [<<страница] | [>>страница] | [В начало ] |