Венгерский метод решения задач

Автор работы: Пользователь скрыл имя, 01 Октября 2015 в 11:05, реферат

Описание работы

Венгерский алгоритм — алгоритм оптимизации, решающий задачу о назначениях за полиномиальное время. Он был разработан и опубликован Харолдом Куном в 1955 году. Автор дал ему имя «венгерский метод» в связи с тем, что алгоритм в значительной степени основан на более ранних работах двух венгерских математиков Кёнига и Эгервари.

Содержание работы

Введение
Описание алгоритма венгерского метода
Венгерский метод для транспортной задачи
Обоснование венгерского метода
Примеры

Файлы: 1 файл

реферат.docx

— 116.15 Кб (Скачать файл)

Предварительный этап. В каждом из столбцов матрицы транспортных издержек   отыскивают минимальный элемент, который вычитают из всех элементов этого столбца. Получают матрицу С'. Далее в каждой строке матрицы С' выбирают минимальный элемент и вычитают его из всех элементов рассматриваемой строки. Приходят к матрице С0 (С0 ~ C), все элементы которой неотрицательны, причем в каждой строке и столбце С0 имеем по крайней мере, один нуль. Строят матрицу Х0 так, чтобы ее ненулевые элементы были расположены в позициях нулей матрицы С0.

Пусть  — номер строки, в которой расположен k-й нуль j-го столбца матрицы С0. Тогда элементы первого столбца матрицы Х0 определяют по рекуррентной формуле

                   (3.3.4)

Т.е. все элементы первого столбца  , которым соответствуют ненулевые элементы в матрицы С0, заполняют нулями, а остальные элементы этого столбца заполняют по методу северо-западного угла.

Допустим, что столбцы Х0 от первого до (j–1) – го включительно уже заполнены. Тогда элементы j-го столбца определяют в соответствии с формулой

                       (3.3.5)

Если  , то Х0 – оптимальный план Т-задачи. Если  , то переходим к первой итерации.

(k+1)-я итерация. Каждая итерация состоит из двух или трех этапов. Итерация начинается первым этапом, а заканчивается вторым. Между первым и вторым этапами в общем случае несколько раз могут быть проведены третий и первый этапы.

Допустим, что уже проведено k итераций, причем  . В этом случае необходимо, используя матрицы Сk и Хk, провести следующую (k+1)-ю итерацию. Перед началом итерации выделяют знаком “+” те столбцы матрицы Сk, для которых невязки по столбцам равны

 .

Первый этап. Если все ненулевые элементы матрицы Сk окажутся в выделенных столбцах, то переходят к третьему этапу. В противном случае пусть некоторый невыделенный нуль находится в  -й  строке и в  -м столбце. Тогда вычисляют значения невязки  -й строки:

 .

Возможен один из двух случаев: 1)  , 2)  . В первом случае  -ю строку Сk отмечают знаком “+” справа  от нее, а сам невыделенный нуль отмечают штрихом. Далее просматривают элементы  -й строки, которые лежат в выделенных столбцах и ищут среди них существенные нули (напомним, что существенным нулем Сk называется такой элемент  , для которого  ). Если таким существенным нулем оказался элемент  , а сам столбец m — выделен, то знак выделения “+” над столбцом m уничтожают, а сам этот нуль отмечают звездочкой.

Затем просматривают m-й столбец и отыскивают в нем нуль (нули), расположенные в отличных от  -й строках. Если такой нуль имеется, то отмечают его штрихом и анализируют невязку его строки.

Далее процесс поиска нулей и выделение их (штрихами или звездочками) продолжается аналогично, и за несколько шагов он заканчивается одним из следующих исходов:

1) найдем очередной невыделенный  нуль матрицы Сk, для которого невязкая в строке  . Тогда отметив его штрихом, переходим ко второму этапу;

2) все нули матрицы Сk оказались выделенными, причем для каждого из нулей, выделяемых штрихом, невязка  . Тогда переходим к третьему этапу.

Во втором случае, отметив этот нуль штрихом, сразу переходим к третьему этапу.

Второй этап. Состоит в построении цепочки из нулей матрицы Сk, отмеченных штрихами и звездочками, и в последующем переходе к новой матрице Хk+1

Пусть для некоторого нуля со штрихом матрицы Сk, расположенного, например, в позиции (  ), невязка строки  . Начиная с этого элемента  , строят цепочку из отмеченных нулей матрицыСk: двигаясь по столбцу  , выбирают нуль со звездочкой  , далее двигаясь от него по строке  , находят нуль со штрихом  . Потом движутся от него по столбцу m2 к следующему нулю со звездочкой и т.д.. Такой последовательный переход от 0’ к 0* по столбцу и от 0* к 0' по строке осуществляют до тех пор, пока это возможно.

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

После того как цепочка вида

построена, осуществляют переход к матрице   от матрицы Хk по формулам

 

         (3.3.7)

где                      (3.3.8)

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

Вычисляем невязку для 

На этом (k+1)-я итерация заканчивается.

Третий этап. Итак, допустим, что все нули выделены. Третий этап заключается в переходе от матрицы Сk к эквивалентной матрице С′k, в которой появляется новый невыделенный нуль (или нули). Пусть  , где минимум выбирают из всех невыделенных элементов матрицы Сk. Тогда из всех элементов невыделенных строк матрицы Сk вычитают h, а ко всем элементам выделенных столбцов прибавляют h. В результате получают матрицу С'k(С'k ~ Ck), в которой все существенные нули матрицы Сk остаются нулями, и кроме того, появляются новые невыделенные нули.

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

Если после выполнения второго этапа   то Хk+1 – оптимальный план. В противном случае переходим к (k+2) итерации.

Отметим некоторые важные особенности венгерского метода.

Поскольку данный метод в отличие от метода потенциалов не использует опорных планов, то явление вырожденности плана для него отсутствует. Это устраняет возможность зацикливания, связанного с вырожденностью планов Т-задачи, которая облегчает программирование метода и его реализацию на ЭВМ.

Метод позволяет на каждой итерации по величине невязки  оценить близость Хk к оптимальному плану, а также верхнюю границу необходимого числа оставшихся итераций Nост:

 .                                   (3.3.9)

Эта формула справедлива для целочисленных значений всех переменных   и  .

Обоснование венгерского метода

Прежде всего введем справедливость признака оптимальности, т.е. если  , то план Хk – оптимален.

Действительно, в силу построения Хk, если  , то   (эти нули называют существенными). Поэтому план Хk оказывается оптимальным для задачи с матрицей Сk, так как

 .                           (3.3.10)

Но матрица Сk получена эквивалентными преобразованиями из исходной матрицы С. Докажем, что Хk – оптимален и для задачи с матрицей С. Матрицы С и Сk как эквивалентные связаны соотношениями

 для всех (i,j)                   (3.3.11)

Тогда значение целевой функции для плана Хk при матрице С будет равно

 

         (3.3.12)

Но так как  , то

 і.                (3.3.13)

Подставляя (3.3.13) в (3.3.12), получим с учетом (3.3.10)

 .      (3.3.14)

Но   и не зависит от плана Хk, поэтому план Хk оптимален и для исходной задачи с матрицей С.

Перейдем теперь к обоснованию алгоритма.

Предварительный этап. На предварительном этапе строят матрицу Хk элементы которой удовлетворяют условиям

,                            (3.3.15)

.                            (3.3.16)

Если все условия (3.3.15), (3.3.16) выполняются как строгие равенства, то план Х0 – оптимален, согласно только что доказанному.

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

Второй этап. Он состоит в построении цепочки из нулей со штрихами и звездочками и переходе к Хk+1. Пусть цепочка имеет вид:

 .               (3.3.17)

Элементы матрицы Хk+1 вычисляют по рекуррентным формулами

 

 

 

 

 

 

 

 

 

 

 

 

где                           (3.3.18)

Так как в каждой строке и столбце имеется как 0', так и 0*, либо они оба отсутствуют, за исключением строки   и столбца  , где имеется лишь 0', то

 

                            (3.3.19)

 

                            (3.3.20)

Поэтому, если матрица Хk удовлетворяла ограничениям (3.3.15), (3.3.16), то и матрица Хk+1 будет им также удовлетворять.

Наконец, на основании соотношений (3.3.19), (3.3.20) получим

 .

Третий этап. В соответствии с правилами перехода от Сk к С'k при выборе элемента h > 0 элементы невыделенных строк Сk уменьшаются на величину h, появляются новые нули, и можно снова перейти к первому этапу. При этом по правилу выделения строк и столбцов все существенные нули Сk останутся нулями и в матрице C'k.

Пример 3.5. Найти решение транспортной задачи со следующими условиями:

 

Проверим условие баланса 

Предварительный этап. Вычитаем из элементов первого столбца 2, из второго – 3, из третьего –1, из четвертого -2. Приходим к матрице С1. Далее, вычитая минимальный элемент из элементов каждой строки, получаем матрицу С0:

                               

 

 

 

Строим начальную матрицу перевозок

Невязки для столбцов dj = 0, 1, 9, 0, для строк dj = 4; 6; 0. Суммарная невязка

Первая итерация. Первый этап. Отмечаем знаком “+” сверху первый и четвертый столбцы, которым соответствуют нулевые невязки, а знаком “х” слева первую и вторую строки, которым отвечают ненулевые невязки, черточкой сверху – существенные нули.

Просматриваем невыделенный второй столбец матрицы С0, находим в нем невыделенный нуль С32 = 0 и отмечаем его штрихом. Так как d3 = 0, то выделяем третью строку знаком “+”. Просматриваем третью строку относительно выделенных столбцов. Там существенных нулей нет. Поскольку в С0 больше не осталось невыделенных нулей (все нули расположены в выделенных строках или столбцах), то переходим к третьему этапу.

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

                 

Переходим к первому этапу.

Первый этап. Среди невыделенных столбцов находим нулевой элемент С22,   который расположен в строке с ненулевой невязкой, а потому переходим ко второму этапу.

Второй этап. Цепочка состоит из одного элемента С22 = 0. Находим   и прибавим q1 = 1 к элементу х1. Получим матрицу Х1.

Вторая итерация. Первый этап. В матрице С1 отмечаем знаком “+” первый, второй и четвертый столбцы, которым отвечают нулевые невязки. Находим в третьем столбце нуль С33 = 0 и отмечаем его штрихом.

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

Информация о работе Венгерский метод решения задач