
- •2. Алгоритмы построения деревьев
- •2.1. Неориентированные покрывающие деревья
- •2.2.Алгоритм построения максимального ориентированного леса
- •3. Алгоритмы поиска путей
- •3.1. Алгоритм поиска кратчайшего пути
- •3.2. Алгоритмы поиска всех кратчайших путей.
- •3.3. Алгоритмы поиска k кратчайших путей
- •4. Потоковые алгоритмы
- •4.1. Определения
- •4.2. Алгоритм поиска увеличивающей цепи
- •4.4. Алгоритм поиска потока минимальной стоимости
- •4.5. Алгоритм поиска максимального динамического потока
- •5. Паросочетания и покрытия
- •5.1. Понятия и определения
- •5.2. Алгоритм решения задачи о паросочетании максимальной мощности
- •5.3. Алгоритм выбора паросочетания максимального веса
- •6. Задача почтальона
- •6.1. Введение
- •6.4. Задача почтальона для смешанного графа
- •7. Сетевые графики. Метод критического пути
- •Контрольные вопросы
- •I. Организационно-методический раздел
- •4. Перечень контрольных вопросов и заданий для самостоятельной работы
- •4. Примерный перечень вопросов к экзамену и зачёту
- •III. Распределение часов курса по темам и видам работ
5.3. Алгоритм выбора паросочетания максимального веса
Взвешенной увеличивающей чередующейся цепью называется чередующаяся цепь, в которой общий вес рёбер, не входящих в паросочетание, превышает общий вес рёбер, входящих в это паросочетание. Цепь называется слабой чередующейся цепью, если в ней число рёбер паросочетания превышает число рёбер, не принадлежащих паросочетанию, нейтральной, если эти числа равны, и сильной, если рёбер паросочетания меньше.
Паросочетание М тогда и только тогда является паросочетанием с максимальным весом, когда для него не существует взвешенных увеличивающих чередующихся цепей. (Без доказательства)
Пусть V = {V1,V2,…,Vz} – множество всех подмножеств вершин графа, включающих нечётное количество вершин. Tm – множество всех рёбер, обе концевые вершины которых принадлежат Vm; T = {T1,T2,…,Tz}. Количество вершин в Vm обозначим 2nm+1.
Ни одно паросочетание не может содержать более чем nm рёбер, принадлежащих множеству Tm.
a(i,j) – вес ребра (i,j);
Представим задачу поиска паросочетания максимального веса как задачу линейного программирования:
Однако практически невозможно перечислить все ограничения этой ЗЛП даже для графа небольшой размерности. ЗЛП, двойственная по отношению к данной, имеет следующий вид:
[Двойственная переменная yi соответствует ограничению (*), а двойственная переменная zm соответствует ограничению (**).
Условия дополняющей нежёсткости для этой пары ЗЛП имеют вид:
Рассмотрим работу алгоритма поиска паросочетания максимального веса. Выполнение алгоритма начинается с нулевого паросочетания (все x(i,j) = 0) и допустимых значений двойственных переменных yi≥0, i X, zm≥0, m=1,2,…,z, удовлетворяющих 1-му и 3-му условиям дополняющей нежёсткости. Только 2-е условие остаётся невыполненным. На каждой итерации алгоритма паросочетание и/или значения двойственных переменных изменяются так, что все условия прямой и двойственной ЗЛП и 1-е и 3-е условия дополняющей нежёсткости продолжают выполняться, а 2-е условие выполняется дополнительно по крайней мере ещё для одной двойственной переменной yi. Поскольку имеется только |X| двойственных переменных yi, то не более чем через |X| итераций все 2-е условия дополняющей нежёсткости оказываются выполненными. Благодаря выполнению условий дополняющей нежёсткости получаемое в результате паросочетание должно быть паросочетанием максимального веса.
Условие 2 нарушается только для открытых вершин, которым соответствуют положительные значения двойственных переменных. Определяется какая-либо открытая вершина v, такая, что yv > 0, и используется алгоритм построения чередующегося дерева с корнем в вершине v. Если найдена увеличивающая цепь, то она сильная. Входившие в паросочетание рёбра цепи заменяются не входившими в него рёбрами этой же цепи. Увеличивается общий вес паросочетания, и в него включается ребро, инцидентное v. Для v выполняется 2-е условие дополняющей нежёсткости. Если найден нечётный цикл, то он стягивается в фиктивную вершину, и алгоритм продолжает работу на преобразованном графе. Если найдено венгерское дерево, то изменяются двойственные переменные таким образом, что остаются выполненными все условия прямой и двойственной ЗЛП и условия дополняющей нежёсткости, за исключением, может быть, 2-го. В результате к чередующемуся дереву может быть добавлено не принадлежащее ему до сих пор ребро. В итоге или yv уменьшится до нуля, в результате чего выполнится 2-е условие, или v становится вершиной паросочетания.
Процедура алгоритма построения паросочетания максимального веса
Шаг 1. M0 – пустое множество рёбер, а все двойственные переменные zm, m=1,2,…,z, равны нулю. Выбрать такие начальные значения двойственных переменных yv, i X, что yi+ yj ≥ a(i,j) для всех рёбер (i,j). (Например, можно каждое yi принять равным половине максимального значения весов рёбер графа.) Положить k = 0 и обозначить исходный граф через Gk = (Xk,Ek).
Шаг 2.
Выбрать в графе Gk
любую нефиктивную открытую вершину v
с yv > 0.
Если такой вершины не существует, то
перейти на шаг 6. В противном случае
выделить в Gk
множество E*
рёбер (i,j),
для которых выполняется условие
.
С помощью алгоритма построения
чередующегося дерева построить дерево
с корнем в вершине v,
содержащее только рёбра из множества
E*.
Если при этом найдётся увеличивающая
чередующаяся цепь, то перейти к шагу 3.
Если образовался нечётный цикл, то
перейти к шагу 4. Если будет построено
венгерское дерево, то перейти к шагу 5.
Шаг 3. Входящие в Mk рёбра цепи заменить не входящими в него рёбрами этой же цепи. Вершина v перестаёт быть открытой. На шаг 2.
Шаг 4. Положить k = k+ 1 обозначить нечётный цикл через Ck. Стянуть Ck в фиктивную вершину ak. Обозначить полученный граф через Gk = (Xk,Ek). Пусть Mk– паросочетание из рёбер Mk–1 принадлежащих Gk. В дальнейшем при расстановке пометок все вершины, которые заменены фиктивной вершиной ak, помечать одинаково с ak. Вернуться на шаг 2 и продолжить построение чередующегося дерева с корнем в вершине, являющейся отображением вершины v в Gk (даже если эта вершина является фиктивной). Заметим, что разметка вершин и раскраска рёбер, полученные на последней итерации алгоритма построения чередующегося дерева, могут оказаться полезными на последующей итерации.
Шаг 5. Принять d1 = min{yi+ yj – a(i,j)} где минимум берётся по всем рёбрам (i,j), таким, что i X0 – внешняя вершина дерева, а j X0 не помечена. Если множество таких рёбер пусто, то d1 = ∞. Положить d2 = min{yi+ yj – a(i,j)}/2, где минимум берётся по всем рёбрам (i,j), таким, что i,j X0 – внешние вершины дерева, но они не стянуты в одну и ту же фиктивную вершину. Если множество таких рёбер пусто, то d2 = ∞.. Принять d3 = min{zm}/2, где минимум берётся по всем множествам Vm мощность которых равна нечётному числу и которые стянуты в фиктивную вершину ak, являющуюся внутренней вершиной дерева. Если множество таких вершин пусто, то d3 = ∞.. Положить d4 = min{yi}, где минимум берётся по всем внешним вершинам i X0 дерева. Если множество таких вершин пусто, то d4 = ∞. И, наконец, определить d = min{d1, d2, d3, d4}. Изменить двойственные переменные yi, zm следующим образом:
1) yi, соответствующие внешним вершинам дерева, уменьшить на величину d.
2) yi, соответствующие внутренним вершинам дерева, увеличить на величину d.
3) zm, соответствующие внешним фиктивным вершинам дерева в графе Gk, увеличить на величину 2d.
4) zm, соответствующие внутренним фиктивным вершинам дерева в графе Gk, уменьшить на величину 2d.
При этом если d = d1, то в E* включить ребро (i,j), для которого достигается минимум в выражении для d1. (Теперь это ребро может быть окрашено.) На шаг 2 – и продолжить построение чередующегося дерева с корнем в v. Если d = d2, то в E* включить ребро (i,j), для которого достигается минимум в выражении для d2. (Теперь это ребро может быть окрашено, что приведёт к образованию нечётного цикла.) На шаг 2 – и продолжить построение чередующегося дерева с корнем в v. Если d = d3, то какая-то из двойственных переменных zm станет нулевой. Преобразовать в исходный нечётный цикл фиктивную вершину, соответствующую этой двойственной переменной. Положить k = k+1 полученный граф обозначить Gk = (Xk,Ek). Положить паросочетание Mk состоящим из всех рёбер паросочетания Mk–1 и ni рёбер множества Ti, инцидентных 2ni вершинам множества Vi (Оставшаяся одна вершина множества Vi инцидентна ребру паросочетания Mk, т.к. все внутренние вершины дерева в графе Gk–1 инцидентны рёбрам паросочетания Mk–1). На шаг 2 – и продолжить построение чередующегося дерева с корнем в v. Если d = d4, то двойственная переменная yi, соответствующая какой-то внешней вершине i, станет нулевой. Тогда в чередующемся дереве цепь, соединяющая корень v с вершиной i, является нейтральной увеличивающей цепью. В паросочетании Mk произвести замену входящих в него рёбер цепи не входящими рёбрами этой же цепи. Вершина v становится инцидентной ребру паросочетания, а вершина i становится открытой, что допустимо из-за равенства нулю yi. На шаг 2.
Шаг 6. Рассмотреть все оставшиеся фиктивные вершины в полученном к этому моменту графе. Произвести преобразование фиктивных вершин в нечётные циклы в порядке, обратном их отысканию, и образовать паросочетание максимальной мощности на каждом из этих нечётных циклов. Полученное в результате паросочетание является паросочетанием максимального веса для исходного графа G0. На этом работа алгоритма заканчивается.