Мађарски алгоритам

Мађарски алгоритам је комбинаторијални оптимизациони алгоритам који решава проблем доделе који има сложеност субекспоненцијално времена и који ишчекује касније примал-дуал методе. Развио га је и објавио 1955. године Харолд Кан, који га је назвао Мађарски алгоритам јер је он свој рад засновао на раду двојице мађарских математичара: Dénes Kőnig and Jenő Egerváry.[1][2]

Џејмс Манкрес је процени о алоритам 1957. и увидео да је временса сложеност субекспоненцијално време. Од тада је алгоритам познат и као Кан-Манкресов алгоритам или Манкресов алгоритам доделе.[3] Теорија комплексности овог алгоритам је била О(n^4), али су Едмондс и Карп, и одвојено од њих Томицава увидели да може да достигне и кубну сложеност. Форд и Фалкерсон су унапредили методу до општег проблема транспортације. 2006. откривено је да је Карл Густав Џакоби решио тај проблем у 19. веку, и да је решење објављено 1890. на латинском језику.

Једноставно објашњење проблема доделе уреди

У овом примеру постоје тру радника: Пера, Мика и Жика. Један од њих мора да очисти тоалет, један да брише подове, и један да пере прозоре, али сва тројица траже различиту плату за различите проблеме. Проблем је наћи најјефтинији начин да се расподели посао. Проблем може да се представи матрицом цена. На пример:

Брисање тоалета Брисање подова Брисање прозора
Пера $2 $3 $3
Мика $3 $2 $3
Жика $3 $3 $2

Мађарска метода, када се примени на табелу изнад, даје минималну цену, која би била 6$ тако што би Пера прао тоалет, Мика брисао подове, а Жика прозоре.

Подешавање уреди

Узимамо ненегативну квадратну матрицу, где је елемент у i-тој колони и ј-том реду представља цену доделе ј-тог посла i-том раднику. Морамо да нађемо посао радницима који ће нас најмање коштати. 

Алгоритам се може једноставније објаснити ако формулишемо проблем помоћу бипартитивног графа. Ако имамо потпуни бипартитивни граф G = (S, T, E) са n радника грана (S) и n послова грана (T), где свака грана има ненегативну цену c(i, j). Хоћемо да нађемо најбоље поклапање са минималном ценом.

Сада позивамо функцију y: (S U T) -> R чији је потенцијал y(i) + y(j) <= c(i, j) за свако i које припада S, j који припадају T. Може се приметити да је цена савршеног поклапања  бар вредност сваког потенцијала. Мађарска метода налази савршено поклапање и потенцијал са једнаким ценама који доказује оптималност.

Алгоритам представљен преко бипартитивног графа уреди

Током рада алгоритма чувамо потенцијал y и оријентацију Gy која има особину да су све гране оријентисане од Т до S чине поклапање М. Иницијано y је 0 свуда, и све гране су оријентисане од S до Т, а М је празно. У сваком корак уили мењамо y тако што му вредност повећавамо или мењамо оријантацију да бисмо постигли поклапање са више грана. Завршили смо ако је М савршено поклапање.

У генералном кораку, нека су   and   чворови који нису пређени са M (тако се   састоји од чворова у S без улазних грана и   који се садржи од чворова из T без излазних грана). Нека је   сет чворова који могу да се дохвате у    од   помоћу усмерене путање која прати само гране које су збијене. Ово може да се израчуна помоћу претраге у дубину.

Ако је   непразан, онда окрени оријентацију путање усмереног графа    од   до  . Тако је величина одговарајућих поклапања повећана за 1.

Ако је   празан, онда нека је .   позитиван јер нема збијених грана у   и   . Повећај y by   на чворовима   и смањи y за   на чвороима  . Резултујуће y је и даље потенцијал. Граф   се мења, али и даље садржи M. Оријентишемо нове гране од S до T. По дефиницији   сет Z чворова који могу да се дохвате од   се повећава (напомена је да се број збијених грана не мора повећати).

Понављамо ове кораке све док М јесте савршено поклапање, и том случају добијамо минималну цену за доделу. Сложеност ове верзије је О(n^4): М се повећава n пута, а у фази где је М непромењено, постоји највише n потенцијалних промена. Време које је потребно за потенцијалну промену је О(n^2).

Интерпретација алгоритма преко матрица уреди

Ако имамо n радника и задатака, и nxn матрицу која садржи цене доделе неког посла сваком раднику, тражимо најбољу варијанту.

Прво се проблем задаје као матрица испод:

 

где су a, b, c, и d радници који морају да раде послове 1, 2, 3, 4. а1, а2, а3, и а4 обележавају шта би се десило кад би радник а, радио одређене задатке. Исто важи и за остале симболе такође. Матрица је квадратна, тако да сваки радник може да обавља један посао.

Корак 1

Онда радимо операције са колонама. Да бисмо извели то, најмањи од аи се умањујеод всаког елемент ау том реду. То ће довести до бар једне нуле у том реду. Ова радња се обавља за све колоне. Сада имамо матрицу са најмање једном нулом по једном реду. Сада покушавамо да доделимо послове агентима тако да сваки агент ради само један посао. Ово је илустровано испод:

0 a2' a3' a4'
b1' b2' b3' 0
c1' 0 c3' c4'
d1' d2' 0 d4'

Нуле које су описане као 0’ су додељени послови

Корак 2

Понекад се може испоставити да је матрицу у овој гази неупотребљива за операцију доделе, као што је приказано у примеру испод.

0 a2' a3' a4'
b1' b2' b3' 0
0 c2' c3' c4'
d1' 0 d3' d4'

У случају изнад, ниједна додела не може да се изврши. Напомена је да се у задатак 1 ефикасно одрадио за агента а и c. Не могу обојица да добију исти задатак. Такође треба напоменути да нико не обавља задатак 3 ефикасно. Да би се ово превазишло, понављамо процедуру изнас по свим колонама, и онда опет гледамо да ли су доделе могуће.

У већини случајева ће ово да да резултат, али ако не, процес се опет понавља итд.

Корак 3

Све нуле у матрици морају да буду прођене тако што ћемо маркирати што мање колона и редова је могуће. Следећа процедура обавља то:

Прво, додељујемо што више задатака је могуће.

  • Ред 1 има једну нулу, значи да је додељен. Нула у реду 3 је прецртана јер је у истој колони 
  • Ред 2 има једну нулу, и онда је додељена 
  • Једина нула у реду 3 је прецртана, тако да ништа није додељено 
  • Ред 4 има две непрецртане нуле. Било која од њих може бити додељена, а друга нула ће бити прецртана 

Алтерантивно, нула у реду 3 може бити додељена, што би проузроковало нулу у првом реду да буде прецртана.

0' a2' a3' a4'
b1' b2' b3' 0'
0 c2' c3' c4'
d1' 0' 0 d4'

А сад део са цртањем:

  • Обележимо све редове који немају доделе 
  • Обележимо све неозначене колоне које имају нуле у новообележеним редовима 
  • Обележимо све редове које имају колоне са претходне тачке 
  • Понављамо за све неозначене редове 
×
0' a2' a3' a4' ×
b1' b2' b3' 0'
0 c2' c3' c4' ×
d1' 0' 0 d4'

Сада цртамо линије кроз све обележене колоне и необележене редове

×
0' a2' a3' a4' ×
b1' b2' b3' 0'
0 c2' c3' c4' ×
d1' 0' 0 d4'

Ово је само један начин за цртање матрице. Постоји још неколико доказаних и проверених начина са истим исходом

Корак 4

Сада уклањамо обележене редове и колоне. Онда ће матрица изгледати овако.

 

Вратимо се на корак 1 и понаљавмо процес док матрица није празна.

Библиографија уреди

  • R.E. Burkard, M. Dell'Amico, S. Martello: Assignment Problems (Revised reprint). SIAM, Philadelphia (PA.). 2012. ISBN 978-1-61197-222-1.
  • M. Fischetti, "Lezioni di Ricerca Operativa", Edizioni Libreria Progetto Padova, Italia, 1995.
  • R. Ahuja, T. Magnanti, J. Orlin, "Network Flows", Prentice Hall, 1993.
  • S. Martello, "Jeno Egerváry: from the origins of the Hungarian algorithm to satellite communication". Central European Journal of Operations Research 18, 47–58, 2010

Референце уреди

  1. ^ Harold W. Kuhn, "The Hungarian Method for the assignment problem", Naval Research Logistics Quarterly, 2: 83–97, 1955. Kuhn's original publication.
  2. ^ Harold W. Kuhn, "Variants of the Hungarian method for assignment problems", Naval Research Logistics Quarterly, 3: 253–258, 1956.
  3. ^ J. Munkres, "Algorithms for the Assignment and Transportation Problems", Journal of the Society for Industrial and Applied Mathematics, 5(1):32–38, 1957 March.

Спољашње везе уреди

Имплементације уреди

(Напомена: неће сви алгоритми испод да задовоље  O(n^3) сложеност)