Аноним

Задача присваивания: различия между версиями

Материал из WEGA
м
 
(не показано 7 промежуточных версий этого же участника)
Строка 3: Строка 3:


== Постановка задачи ==
== Постановка задачи ==
Пусть дан [[полный граф|полный]] [[двудольный граф]] <math>G = (X, F, X \times Y) \;</math> с присвоенным каждому ребру (x, y) весом w(x, y). [[Паросочетание]] M представляет собой подмножество ребер, такое, что никакие два ребра в M не имеют общей вершины. Паросочетание является [[совершенное паросочетание|совершенным]], если в него входят все вершины. Предположим, что |X| = |Y| = n. Задача поиска паросочетания на взвешенных двудольных графах заключается в нахождении паросочетания с максимальным общим весом, где <math>w(M) = \sum_{e \in M} w(e) \;</math>. Поскольку граф G является полным и двудольным, у него имеется совершенное паросочетание. Алгоритм для решения данной задачи предложили Кун [4] и Манкрес [6]. Будем предполагать, что всех веса ребер неотрицательны.
Пусть дан [[полный граф|полный]] [[двудольный граф]] <math>G = (X, Y, X \times Y) \;</math> с присвоенным каждому ребру (x, y) весом w(x, y). [[Паросочетание]] M представляет собой подмножество ребер, такое, что никакие два ребра в M не имеют общей вершины. Паросочетание является [[совершенное паросочетание|совершенным]], если в него входят все вершины. Предположим, что |X| = |Y| = n. Задача поиска паросочетания на взвешенных двудольных графах заключается в нахождении паросочетания с максимальным общим весом <math>w(M) = \sum_{e \in M} w(e) \;</math>. Поскольку граф G является полным и двудольным, у него имеется совершенное паросочетание. Алгоритм для решения данной задачи предложили Кун [4] и Манкрес [6]. Будем предполагать, что всех веса ребер неотрицательны.


== Основные результаты ==
== Основные результаты ==
Определим допустимую разметку вершин £ как отображение множества вершин G на множество вещественных чисел, где
Определим ''допустимую разметку вершин'' <math>\ell \;</math> как отображение множества вершин G на множество вещественных чисел, где <math>\ell(x) + \ell(y) \ge w(x, y) \;</math>.
£(x) + £(y) > w(x;y):


Назовем l(x) меткой вершины x. Допустимую разметку вершин легко вычислить следующим образом:
8y 2 Y    l(y) = 0
and
8x 2 X    £(x) = maxw(x; y):
y2Y


Определим подграф равенства, G^, как остовный подграф G, содержащий все вершины G и только те ребра (x, y), веса которых удовлетворяют условию w(x, y) =
Назовем <math>\ell(x) \;</math> меткой вершины x. Допустимую разметку вершин легко вычислить следующим образом:
 
<math>\forall y \in Y \; \; \; \ell(y) = 0</math>
 
<math>\forall x \in X \; \; \; \ell(x) = max_{y \in Y} \; w(x, y).</math>
 
 
Определим ''подграф равенства'', <math>G_{ \ell}\;</math>, как остовный подграф G, содержащий все вершины G и только те ребра (x, y), веса которых удовлетворяют условию <math>w(x, y) = \ell(x) + \ell(y) \;</math>.




Строка 21: Строка 22:




'''Теорема 1. Если подграф равенства Gi содержит совершенное паросочетание M*, то M* является в G паросочетанием с максимальным весом.'''
'''Теорема 1. Если подграф равенства, <math>G_{ \ell}\;</math>, содержит совершенное паросочетание M*, то M* является в G паросочетанием с максимальным весом.'''




Заметим, что сумма меток является верхней границей веса паросочетания с максимальным весом. Алгоритм последовательно находит паросочетание и допустимую разметку, такие, что вес паросочетания оказывается равен сумме всех меток.
Действительно, заметим, что сумма меток является верхней границей веса совершенного паросочетания с максимальным весом. Алгоритм последовательно находит паросочетание и допустимую разметку, такие, что вес паросочетания оказывается равен сумме всех меток.
   
   


'''Высокоуровневое описание'''
'''Высокоуровневое описание'''


Вышеприведенная теорема служит основой алгоритма нахождения паросочетания с максимальным весом в полном двудольном графе. Начав с допустимой разметки, вычислим подграф равенства и затем найдем максимальное паросочетание в этом подграфе (на этом этапе веса ребер не учитываются). Если найденное паросочетание является совершенным, процесс на этом завершается. В противном случае к подграфу равенства добавляются ребра посредством пересмотра меток вершин. После добавления ребер к подграфу равенства либо увеличивается размер паросочетания (был найден дополняющий путь), либо продолжает расти венгерское дерево.1 В первом случае этот этап процесса завершается и начинается новый (поскольку размер паросочетания вырос). Во втором случае венгерское дерево растет за счет добавления к нему новых вершин, что, очевидно, не может произойти более n раз.
Вышеприведенная теорема служит основой алгоритма нахождения паросочетания с максимальным весом в полном двудольном графе. Начав с допустимой разметки, вычислим подграф равенства и затем найдем максимальное паросочетание в этом подграфе (на этом этапе веса ребер не учитываются). Если найденное паросочетание является совершенным, процесс на этом завершается. В противном случае к подграфу равенства добавляются ребра посредством пересмотра меток вершин. После добавления ребер к подграфу равенства либо увеличивается размер паросочетания (был найден дополняющий путь), либо продолжает расти [[венгерское дерево]]. В первом случае этот этап процесса завершается и начинается новый (поскольку размер паросочетания вырос). Во втором случае венгерское дерево растет за счет добавления к нему новых вершин, что, очевидно, не может произойти более n раз.




1 Эта структура включает исследованные ребра при поиске базисного возможного решения одновременно из всех свободных вершин в S. Когда в T найдена вершина, сопоставленная какой-либо вершине из S, нужно исследовать только соответствующее ребро; однако в S исследуются все ребра, инцидентные этой вершине.
''(Структура венгерского дерева включает исследованные ребра при поиске базисного возможного решения одновременно из всех свободных вершин в S. Когда в T найдена вершина, сопоставленная какой-либо вершине из S, нужно исследовать только соответствующее ребро; однако в S исследуются все ребра, инцидентные этой вершине).''




Строка 38: Строка 39:




Стоит отметить свойство данного алгоритма:
Стоит отметить следующие свойства данного алгоритма:
~s = XnS:
 
T =YnT :
<math>\bar{S} = X \backslash S \;</math>.
\S\>\T\.
 
<math>\bar{T} = Y \backslash T \;</math>.


<math>|S| > |T| \;</math>.


Между S и T не имеется ребер, поскольку в противном случае не было бы возможности полностью вырастить венгерские деревья. Поскольку венгерские деревья выращиваются в G^, альтернативные вершины в поиске помещаются в S и T. Для обновления меток следует взять метки из S и начать равномерно уменьшать их (скажем, на значение A), в то же время увеличивая метки в T на то же значение A. Этот подход гарантирует, что ребра, ведущие из S в T, не исчезнут из подграфа равенства (рис. 1).


Между S и <math>\bar{T}</math> не имеется ребер, поскольку в противном случае не было бы возможности полностью вырастить венгерские деревья. Поскольку венгерские деревья выращиваются в <math>G_{ \ell}\;</math>, альтернативные вершины в поиске помещаются в S и T. Для обновления меток следует взять метки из S и начать равномерно уменьшать их (скажем, на значение <math>\lambda \;</math>), в то же время увеличивая метки в T на то же значение <math>\lambda \;</math>. Этот подход гарантирует, что ребра, ведущие из S в T, не исчезнут из подграфа равенства (рис. 1).


Поскольку метки в S уменьшаются, ребра (в графе G), ведущие из S в T, потенциально могут попасть в подграф равенства Gi. По мере увеличения значения A в какой-то момент ребро окажется в подграфе равенства. В этот момент процесс следует остановить и обновить венгерское дерево. Если вершина из T, добавленная к T, сопоставлена с вершиной из S, обе эти вершины перемещаются в S и T, что увеличивает размер венгерского дерева. Если вершина из T свободна, то дополняющий путь найден и данный этап завершен. Этап состоит из таких шагов, выполненных между приращениями размера паросочетания. Поскольку в G всего n вершин, у алгоритма будет не более n этапов, поскольку на каждом этапе размер паросочетания увеличивается на 1. В рамках каждого этапа размер венгерского дерева увеличивается не более n раз. Очевидно, что за время O(n2) можно обнаружить, какое ребро, ведущее из S в T, первым войдет в подграф равенства (для этого нужно просто просмотреть все ребра). Общее время выполнения в таком случае составит O(n4). Теперь покажем, как реализовать это подход за время O(n3).
 
Поскольку метки в S уменьшаются, ребра (в графе G), ведущие из S в <math>\bar{T}</math>, потенциально могут попасть в подграф равенства <math>G_{ \ell}\;</math>. По мере увеличения значения <math>\lambda \;</math> в какой-то момент ребро окажется в подграфе равенства. В этот момент процесс следует остановить и обновить венгерское дерево. Если вершина из <math>\bar{T}</math>, добавленная к T, сопоставлена с вершиной из <math>\bar{S}</math>, обе эти вершины перемещаются в S и T, что увеличивает размер венгерского дерева. Если вершина из <math>\bar{T}</math> свободна, то дополняющий путь найден и данный этап завершен. Этап состоит из таких шагов, выполненных между приращениями размера паросочетания. Поскольку в G всего n вершин, у алгоритма будет не более n этапов, так как на каждом этапе размер паросочетания увеличивается на 1. В рамках каждого этапа размер венгерского дерева увеличивается не более n раз. Очевидно, что за время <math>O(n^2) \;</math> можно обнаружить, какое ребро, ведущее из S в <math>\bar{T}</math>, первым войдет в подграф равенства (для этого нужно просто просмотреть все ребра). Общее время выполнения в таком случае составит <math>O(n^4) \;</math>. Теперь покажем, как реализовать этот подход за время <math>O(n^3) \;</math>.




[[Файл:Assgn.png]]
[[Файл:Assgn.png]]


Задача присваивания, рис. 1
Рис. 1. Множества S и T, поддерживаемые алгоритмом
 
 
'''Более эффективная реализация'''
 
Определим ''провис ребра'' следующим образом:


Множества S и T, поддерживаемые алгоритмом
<math>slack(x, y) = \ell(x) + \ell(y) - w(x, y)</math>.


Тогда


Более эффективная реализация
<math>\lambda = min_{x \in S, y \in \bar{T}} \; slack(x, y)</math>.


Определим провис ребра следующим образом:
slack(x; y) = l(x) + l(y) - w(x; y) : Тогда
Я =    min  slack(x; y):
x2S;y2T


Интуитивно кажется, что вычисление <math>\lambda \;</math> требует <math>O(n^2) \;</math> времени. Для каждой вершины <math>y \in \bar{T} \;</math> отметим ребро с минимальным провисом, т.е.


Интуитивно кажется, что вычисление Я требует O(n2) времени. Для каждой вершины y 2 T отметим ребро с минимальным провисом, т.е.
<math>slack[y] = min_{x \in S} \; slack(x, y)</math>.
slack[y] = min slack(x; y):
x2S




Вычисление slack[y] для всех y 2 T требует O(n2) времени в начале этапа. По мере продвижения по данному этапу все значения провисов легко обновляются за время O(n), поскольку все они изменяются на одну и ту же величину (метки вершин из S уменьшаются равномерным образом). При перемещении вершины u из S в S необходимо перевычислить провисы вершин в T, что требует O(n) времени. Однако перемещать вершину из S в S можно не более n раз.
Вычисление slack[y] для всех <math>y \in \bar{T} \;</math> требует <math>O(n^2) \;</math> времени в начале этапа. По мере продвижения по данному этапу все значения провисов легко обновляются за время O(n), поскольку все они изменяются на одну и ту же величину (метки вершин из S уменьшаются равномерным образом). При перемещении вершины u из <math>\bar{S}</math> в S необходимо перевычислить провисы вершин в <math>\bar{T}</math>, что требует O(n) времени. Однако перемещать вершину из <math>\bar{S}</math> в S можно не более n раз.




Таким образом, каждый этап может быть реализован за время O(n2). Поскольку имеется n этапов, общее время выполнения составляет O(n3). Для разреженных графов есть способ реализации алгоритма с временем выполнения O(n(m + n log n)) с использованием min потоков минимальной стоимости [ ], где m – количество ребер.
Таким образом, каждый этап может быть реализован за время <math>O(n^2) \;</math>. Поскольку имеется n этапов, общее время выполнения составиет <math>O(n^3) \;</math>. Для разреженных графов есть способ реализации алгоритма с временем выполнения O(n(m + n log n)) с использованием потоков минимальной стоимости [1], где m – количество ребер.


== Применение ==
== Применение ==
4446

правок