Венгерский алгоритм — это алгоритм оптимизации, который предназначен для решения задачи о назначениях за полиномиальное время.
Венгерский алгоритм разработал и опубликовал Гарольд Кун (Harold Kuhn) в 1955-ом году. Кун присвоил алгоритму наименование «венгерский», так как он в существенной мере базировался на более ранних работах двух венгерских специалистов, а именно, Денеша Кенига (Dénes Kőnig) и Эйгена Эгервари (Jenő Egerváry).
В 1957-ом году Джеймс Манкрес (James Munkres) сумел показать, что данный алгоритм способен работать за строго полиномиальное время, то есть, за время порядка полинома от n, которое не зависит от величины стоимостей. По этой причине в литературе этот алгоритм фигурирует не только как венгерский, но и как алгоритм Куна-Манкреса или алгоритм Манкреса.
Кстати, относительно уже недавно, а именно, в 2006-ом году, стало известно, что точно такой же алгоритм изобрел раньше на целый век до Куна немецкий математик Карл Густав Якоби (Carl Gustav Jacobi). Оказалось, что его работа «About the research of the order of a system of arbitrary ordinary differential equations», которая была напечатана посмертно в 1890-ом году и содержала помимо других результатов и полиномиальный алгоритм решения задачи о назначениях, была написана на латыни, и поэтому ее публикация оказалась незамеченной среди математиков.
Необходимо отметить, что задача о назначениях представляет собой частный случай классической транспортной задачи и, следовательно, может считаться задачей транспортного типа. Также следует помнить, что применение к задаче о назначениях симплексного метода не является эффективным вариантом, поскольку каждое ее допустимое базисное решение может считаться вырожденным. Совокупность специфических особенностей задачи о назначениях явилась стимулом к разработке эффективной методики ее решения, которая известна как венгерский метод.
К частному случаю транспортной задачи относится задача о назначениях, в которой количество пунктов производства равняется количеству пунктов назначения, то есть, транспортная таблица обладает формой квадрата. Помимо этого, во всех пунктах назначения объем потребности равняется единице, и величина предложения всех пунктов производства также равняется единице. Каждую задачу о назначениях можно решить с применением методов линейного программирования или алгоритма решения транспортной задачи. Тем не менее так как данная задача имеет особую структуру, был выработан специальный алгоритм, который получил наименование Венгерского алгоритма.
Венгерский алгоритм считается одним из самых интересных и самых распространенных методик решения транспортной задачи. Представим главные идеи венгерского алгоритма на примере решения задачи выбора, то есть, задачи о назначениях, представляющей собой частный случай транспортной задачи, а далее можно обобщить данный метод для произвольных транспортных задач.
Допустим, что есть различные работы и механизмы, каждый из которых способен исполнять любую работу, но с различным уровнем эффективности. Производительность механизмов при исполнении работ можно обозначить:
i = 1, ..., n; j = 1, ..., n.
Необходимо таким образом выполнить распределение механизмов по работам, чтобы обеспечить максимальный суммарный эффект от их применения. Подобные задачи именуются задачами выбора или задачами о назначениях.
Формально такая задача может быть описана следующим образом. Следует сделать выбор такой последовательности компонентов из матрицы, чтобы сумма стала максимальной, причем из каждой строки и столбца «С» может быть выбран лишь один компонент.
Нулевые компоненты матрицы «С» именуются независимыми нулями, когда каждая строка и столбец, на пересечении которых располагается компонент, не содержат другие такие компоненты.
Две прямоугольные матрицы «С» и «D» именуются эквивалентными (C ~ D), если от одной можно перейти к другой с помощью конечного числа элементарных преобразований. Задачи о назначениях, которые определяются эквивалентными матрицами, считаются эквивалентными, то есть, оптимальные решения одной из них являются оптимальными и для второй. Причем, справедливо и обратное утверждение.
Венгерский алгоритм является процедурой, которая состоит из следующих операций:
Далее следует вернуться ко второму шагу и произвести назначение. Шаги два и три необходимо выполнять до тех пор, пока не будет достигнуто оптимальное решение.