Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тезисы по философии-2.1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.11 Mб
Скачать

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. На этом работа алгоритма заканчивается.