Hungarian Method (匈牙利算法)

1 Introduction
Hungarian Method is often discussed by areas of optimization or operational research, it is also applied in graph matching, which determines how to give a
optimal assignment under some fitness function. I focus on how to implement it in matlab code. I encountered some diffculties firstly, fortunately I attacked them one by one.


Hungarian method was firstly presented by Kuhn in 1955 at his paper [2]. The problem which Hungarian method applies for, is formulated as follows:

      Suppose n individuals (i = 1,...,n) are available for n jobs (j =1,...,n) and that a rating matrix R = (rij) is given, where the realnumbers, for all i and j. An assignment consists of the choice of one job j1for each individual i such that no job is assigned to two different men. Thus, all of the jobs are assigned and an assignment is a permutation
      (1  2  ...   n
      j1 j2 ...  jn )
of he integers 1,2,...,n. The General Assignment Problem asks: For which assignments is the sum r1j1+r1j2+···+r1jnof the rating

is largest?


  Of course, the formulation of General Assignment Problem can also refer to literature [3, 1].


2 Implementation
   I thoroughly read the paper [2], I understood all the theoretical basis of the Hungarian Method, but the flow char for the method is messy for me to implement the method. The flow chart had many turnaround, it is difficult for me. The other thing I can’t understand is the concept of essential individual and essential jobs. Although I was failure for implementing the method describe  in [2], the thought contained in it is novelty, and made the time complexity to
O(n^3), where n is the number of individuals.

   I did not give up. I buy a book [1] from a bookstore, It gives me some clue and told me that Hungarian method have been experienced many variants, and become more understand by people, but the name is leaved untouched. That means, if we want implement the Hungarian Method, we must not resort to the original paper [2], we must resort to the more modern Hungarian method.  So I come back to the Google engine to search the code for Hungarian Method, I find one which called bghungar.m (You can download this file from searching in Google). This method is very similar to that of in book [1]. I took nearly one day to understand the code.


   Although the above code is better than that of in book [2], it also has many break statements, and the variable names are not human-friendly. Fortunately I found a better implementation which complies with the module design and better understand. Not like the above code, It default compute the minimization of the assignment problem. For this reason, I nearly delete that code file for that I use it to compute a maximization assignment problem, which the answer is not correspondence to the right answer.


  所以,我们在没有弄清事实之前,千万不要下结论,做出草率的举动。在阅读代码的时候,我常常惊叹别人的天才级的编程方法和技巧,如果换成我,就可能编不出来那样的代码。里面的跳转语句很多,不易于阅读,不易于理解。虽然我为读懂上述的代码而感到高兴,可是,我很不满意那样的代码,因为里面有很多break 语句。万幸的是,我找到了一个按模块化原则设计出来的代码Hungarian.m (同样,该代码也可通过Google搜索出来),我接下来的任务就是看看他是采用什么样的手段将看是很复杂琐碎的匈牙利算法模块化设计出来。


References
[1]  运筹学教材编写组. 运筹学(Operations Research). 清华大学出版社, 北京, 4 edition, 2012.
[2]  Harold W. Kuhn. The hungarian method for the assignment problem. Naval Research Logistics Quarterly, 2:83–97, 1955.
[3]  Christos H. Papadimitriou and Kenneth Steiglitz. Combinatorial Optimization: Algorithms and Complexity. Prentice-Hall, Inc., Upper Saddle River,
NJ, USA, 1982.

你可能感兴趣的:(code,method,匈牙利算法,Hungarian)