Algorithme hongrois
L'algorithme hongrois ou mĂ©thode hongroise, aussi appelĂ© algorithme de Kuhn-Munkres, est un algorithme d'optimisation combinatoire, qui rĂ©sout le problĂšme d'affectation en temps polynomial. C'est donc un algorithme qui permet de trouver un couplage parfait de poids optimum (minimum ou maximum) dans un graphe biparti dont les arĂȘtes sont valuĂ©es.
Algorithme
On peut présenter l'algorithme sous plusieurs formes. La premiÚre donnée est une présentation assez combinatoire utilisant des matrices, la seconde est une présentation dans le cadre de l'optimisation linéaire.
Description matricielle
Soit n projets et n Ă©quipes, et une matrice nĂn d'entiers positifs, contenant le temps nĂ©cessaire Ă chaque Ă©quipe pour rĂ©aliser chaque tĂąche. On souhaite affecter chaque tĂąche Ă une Ă©quipe afin de minimiser le temps total de rĂ©alisation, c'est-Ă -dire la somme des temps pris pour chaque tĂąche.
On illustre ici l'algorithme avec une matrice de la forme suivante :
La version présentée ici correspond essentiellement à la version de Munkres en .
- Ătape 0
Pour chaque ligne de la matrice, on soustrait Ă l'ensemble de la ligne la valeur minimale de celle-ci. La matrice a alors au moins un zĂ©ro par ligne. On rĂ©pĂšte la mĂȘme opĂ©ration sur les colonnes. On obtient alors un problĂšme Ă©quivalent avec une matrice ayant au moins un zĂ©ro par ligne et par colonne.
0 | a2' | a3' | a4' |
b1' | b2' | b3' | 0 |
c1' | c2' | c3' | 0 |
d1' | 0 | 0 | d4' |
Les Ă©tapes 1 et 2 vont permettre de sĂ©lectionner le maximum de zĂ©ros indĂ©pendants, c'est-Ă -dire sĂ©lectionner un seul zĂ©ro par ligne et par colonne. La procĂ©dure pour trouver le nombre maximum de zĂ©ros indĂ©pendants est explicitĂ©e par Munkres, lĂ oĂč Kuhn n'apportait pas de mĂ©thode constructive pour rĂ©aliser cette Ă©tape.
- Ătape 1
On parcourt tous les zĂ©ros (non sĂ©lectionnĂ©s) et on sĂ©lectionne chaque zĂ©ro (en rouge ici) s'il n'est pas dans la mĂȘme ligne ou colonne qu'un zĂ©ro dĂ©jĂ sĂ©lectionnĂ©.
0 | a2 | a3 | a4 |
b1 | b2 | b3 | 0 |
c1 | c2 | c3 | 0 |
d1 | 0 | 0 | d4 |
Si l'on a sĂ©lectionnĂ© n zĂ©ros, alors on arrĂȘte l'algorithme.
Si l'on a sélectionné au moins un zéro supplémentaire au cours de cette étape, découvrez toutes les lignes et colonnes, retirez tous les primes (voir plus bas).
- Ătape 2
- Couvrir chaque colonne ayant un zéro sélectionné.
Ă | Ă | Ă | ||
0 | a2 | a3 | a4 | |
b1 | b2 | b3 | 0 | |
c1 | c2 | c3 | 0 | |
d1 | 0 | 0 | d4 |
- Choisissez successivement un zéro non couvert, marquez-le d'un prime, puis
- S'il y a un zéro sélectionné sur sa ligne, alors découvrez la colonne de ce zéro-là et couvrez la ligne.
- S'il n'y a pas de zéro sélectionné sur sa ligne, alors on n'a pas sélectionné le nombre maximal de zéros indépendants, passez à l'étape 2'
Ă Ă 0 a2 a3 a4 b1 b2 b3 0 c1 c2 c3 0 d1 0 0' d4 Ă
- S'il n'y a plus de zéro non couvert, alors d'aprÚs le théorÚme de König on a sélectionné le nombre maximal de zéros indépendants, et on a le nombre minimum de lignes et colonnes qui couvrent tous les zéros. Passez à l'étape 3.
- Ătape 2'
On est dans le cas oĂč l'on n'a pas sĂ©lectionnĂ© le nombre maximal de zĂ©ros indĂ©pendants.
Soit le seul 0' qui n'est pas couvert. Soit le zĂ©ro sĂ©lectionnĂ© sur la colonne de (qui existe sinon serait sĂ©lectionnĂ© Ă l'Ă©tape 1). Soit alors, , i pair, le 0' sur la ligne de qui existe nĂ©cessairement; et , i impair, le zĂ©ro sĂ©lectionnĂ© sur la colonne de s'il existe (sinon on arrĂȘte la suite).
La suite comprend alors un 0' de plus que de zéro sélectionné. On peut alors directement substituer ces 0' aux zéros sélectionnés de la suite. On a alors un ensemble avec un zéro indépendant de plus que précédemment. On retourne à l'étape 1, en gardant les nouveaux zéros sélectionnés, mais en effaçant les primes, et les couvertures de colonnes et lignes.
- Ătape 3
Trouvez , la valeur minimum de la sous-matrice des éléments non couverts trouvée à l'étape 2. Il faut alors ajouter à toutes les lignes couvertes, et la retirer à toutes les colonnes non couvertes.
Retournez à l'étape 1, en conservant la sélection des zéros, la couverture les lignes et colonnes, et les primes.
Optimalité de la solution trouvée
On remarque que les seules modifications rĂ©alisĂ©es sur la matrice au cours de cet algorithme sont l'addition et la soustraction d'une valeur Ă l'ensemble d'une ligne ou d'une colonne. Une telle modification nâaltĂšre pas la ou les affectations optimales, mais uniquement le coĂ»t optimal. L'algorithme navigue donc entre des matrices correspondant Ă des problĂšmes Ă©quivalents.
De plus les valeurs de la matrice Ă©tant, et restant positives, l'algorithme ne peut sâarrĂȘter, en Ă©tape 1, que sur une solution optimale pour la matrice modifiĂ©e (car de coĂ»t nul), et donc pour le problĂšme original.
DĂ©monstration du temps dâexĂ©cution polynomial
On peut montrer que l'algorithme, tel que prĂ©sentĂ© ici, sâarrĂȘte nĂ©cessairement en moins de opĂ©rations. Cependant, une amĂ©lioration proposĂ©e par Edmonds et Karp, (et Tomizawa indĂ©pendamment), permet de rĂ©duire le temps dâexĂ©cution Ă . On remarquera que n est en rĂ©alitĂ© la dimension de la matrice, et non la taille de l'entrĂ©e qui est elle de . On considĂšre ici que l'addition, la soustraction, et la comparaison d'entiers sont des opĂ©rations de base et nĂ©cessitent . Cela dit, dans le cas contraire oĂč l'on effectuerait les calculs sur des entiers longs (arithmĂ©tique multiprĂ©cision), cela ne changerait en rien l'aspect polynomial de l'algorithme par rapport Ă la taille de l'entrĂ©e du problĂšme. En effet, la taille des entiers manipulĂ©s au fur et Ă mesure de l'algorithme reste forcĂ©ment polynomiale, car seules les Ă©tapes 0 et 3 modifient la matrice et toutes deux ne peuvent faire augmenter la somme de tous les entiers de la matrice.
Complexité de l'algorithme original
Listons le nombre d'opĂ©rations nĂ©cessaires pour lâexĂ©cution de chacune des Ă©tapes.
- Ătape 0 : . Pour chaque ligne et chaque colonne, n opĂ©rations pour calculer le minimum, puis n opĂ©rations pour le soustraire Ă chaque Ă©lĂ©ment.
- Ătape 1 : . En gardant en mĂ©moire pour chaque ligne et chaque colonne un boolĂ©en disant si elle contient dĂ©jĂ un zĂ©ro sĂ©lectionnĂ©, il suffit de parcourir tous les Ă©lĂ©ments de la matrice, en vĂ©rifiant si c'est un zĂ©ro et si sa ligne et sa colonne contiennent un zĂ©ro sĂ©lectionnĂ©.
- Ătape 2 : . Lister les zĂ©ros non couverts, et ajouter Ă cette liste les zĂ©ros nouvellement dĂ©couverts lorsque l'on dĂ©couvre une colonne. On suit alors la liste des zĂ©ros non couverts en vĂ©rifiant qu'ils le sont toujours. On couvre au plus n lignes, et, Ă chaque couverture de ligne, il est nĂ©cessaire de parcourir une ligne et une colonne, soit 2n cases.
- Ătape 2' : .
- Ătape 3 : .
Soit le nombre maximal de zĂ©ros indĂ©pendants dans la matrice au dĂ©but de lâexĂ©cution de l'Ă©tape 3 pour la k-iĂšme fois. On remarque facilement que, si , alors il n'y aura pas d'Ă©tape 2' entre la (k)Ăšme et la (k+1)Ăšme Ă©tape 3, car dans ce cas aprĂšs la (k)Ăšme Ă©tape 3 on a toujours sĂ©lectionnĂ© le nombre maximal de zĂ©ros indĂ©pendants. On peut de plus dĂ©montrer que, sous cette mĂȘme hypothĂšse, au dĂ©but de la (k+1)Ăšme Ă©tape 3 on aura strictement plus de lignes couvertes qu'au dĂ©but de la (k)Ăšme Ă©tape 3. En effet, on remarque d'abord facilement que les zĂ©ros sĂ©lectionnĂ©s et primes sont conservĂ©s par l'Ă©tape 3. Ătant donnĂ© que l'on a dĂ©jĂ sĂ©lectionnĂ© le nombre maximal de zĂ©ros indĂ©pendants aprĂšs la (k)Ăšme Ă©tape 3, on dĂ©montre aisĂ©ment que les seules opĂ©rations qui peuvent ĂȘtre rĂ©alisĂ©es entre la (k)Ăšme Ă©tape 3 et la (k+1)Ăšme Ă©tape3 sont des couvertures de ligne. Il y aura au moins une couverture de ligne, car l'Ă©tape 3 fait apparaitre un zĂ©ro non couvert Ă l'endroit du minimum des Ă©lĂ©ments non couverts.
On en déduit qu'il ne peut y avoir que n successions d'étapes 1, 2 et 3 avant d'obtenir un zéro indépendant supplémentaire. L'algorithme se poursuit jusqu'à obtenir une matrice avec n zéros indépendants. Lors de l'obtention de x zéros indépendants supplémentaires à l'étape 3, au plus x étapes 2' se trouveront exécutées.
On en dĂ©duit que l'algorithme sâarrĂȘte, aprĂšs lâexĂ©cution d'au plus des Ă©tapes prĂ©sentĂ©es ci-dessus. Donc la complexitĂ© totale est .
On peut de plus démontrer que l'étape 3 ne peut augmenter la somme totale des entiers dans la matrice, et donc ne pose aucun problÚme en arithmétique multiprécision. En effet, aprÚs l'étape 2, et donc en début d'étape 3, le nombre de colonnes non couvertes est supérieur ou égal au nombre de lignes couvertes. Donc dans l'étape 3 on retire au moins autant de fois qu'on l'ajoute.
Description par l'optimisation linéaire
On prĂ©sente maintenant l'algorithme depuis un autre point de vue. L'algorithme est le mĂȘme, mais on utilise les rĂ©sultats d'optimisation linĂ©aire pour l'Ă©tudier[1]. On se place dans un graphe biparti dont les sommets sont divisĂ©s en deux groupes A et B de mĂȘme cardinal, et oĂč l'arĂȘte entre et est de poids .
Représentation par l'optimisation linéaire
Le programme d'optimisation linĂ©aire en nombres entiers pour le problĂšme du couplage parfait de poids minimum est le suivant, oĂč la variable :
minimiser (minimiser le coĂ»t total) tel que pour tout (chaque sommet de est adjacent Ă une arĂȘte sĂ©lectionnĂ©e) et pour tout (chaque sommet de est adjacent Ă une arĂȘte sĂ©lectionnĂ©e) pour tout . (la variable vaut 1 si l'arĂȘte ab est sĂ©lectionnĂ©e, et 0 sinon)
On le relĂąche en un problĂšme d'optimisation linĂ©aire en nombres rĂ©els, en remplaçant par . Le dual de ce nouveau programme peut ĂȘtre Ă©crit de la façon suivante :
maximiser tel que pour tout .
La condition d'optimalité dans ce cas est la suivante. Une solution x est optimale pour le primal (c.-à -d. pour le premier problÚme) s'il existe une solution (u,v) optimale pour le dual telle que :
Algorithme
Le principe de l'algorithme est de transformer peu à peu une solution (u,v) pour le dual, en respectant les contraintes, pour construire une solution primale satisfaisant les contraintes d'optimalité.
L'algorithme est le suivant :
- Initialisation :
- Boucle : Tant que le graphe G constituĂ© des arĂȘtes (a,b) telles que ne contient pas de couplage parfait, faire :
- Retourner un couplage parfait de G.
Correction et complexité
L'algorithme a une complexité en temps cubique[1].
Historique
Il a Ă©tĂ© proposĂ© en 1955 par le mathĂ©maticien amĂ©ricain Harold Kuhn[3], qui l'a baptisĂ© « mĂ©thode hongroise » parce qu'il s'appuyait sur des travaux antĂ©rieurs de deux mathĂ©maticiens hongrois : DĂ©nes KĆnig et JenĆ EgervĂĄry (en)[4]. L'article a Ă©tĂ© publiĂ© dans la revue Naval Research Logistic Quarterly car le projet de recherche Ă©tait financĂ© par l'Office of Naval Research Logistics Branch[4]. James Munkres a revu l'algorithme en 1957, et a prouvĂ© qu'il s'exĂ©cutait en temps polynomial[5].
En 2006, il a été découvert que le mathématicien allemand Charles Gustave Jacob Jacobi avait décrit l'algorithme dans un article posthume, au XIXe siÚcle[6].
L'algorithme est vu comme une des premiÚres apparitions de l'idée de schéma primal-dual.
Liens avec d'autres algorithmes
L'algorithme d'Edmonds pour les couplages généralise l'algorithme hongrois et traite le problÚme du couplage maximum dans tous les graphes en temps polynomial.
Références
- (en) Ola Svensson (lecturer), Mateusz Golebiewski et Maciej Duleba (scribes), « Topics in Theoretical Computer Science, Lecture 5: Understanding and using Linear Programming », sur Ăcole polytechnique fĂ©dĂ©rale de Lausanne, .
- Un tel ensemble existe d'aprÚs le théorÚme de Hall.
- (en) « Harold W. Kuhn, in his celebrated paper entitled The Hungarian Method for the assignment problem, [Naval Research Logistic Quarterly, 2 (1955), pp. 83-97] described an algorithm for constructing a maximum weight perfect matching in a bipartite graph » dans AndrĂĄs Frank (en), On Kuhnâs Hungarian Method â A tribute from Hungary
- (en) Harold W. Kuhn, « The Hungarian Method for the Assignment Problem: Introduction by Harold W. Kuhn », sur Tom Kelsey à l'Université de St Andrews.
- (en) James Munkres, Algorithms for the assignment and transportation Problem.
- (en) Silvano Martello, « Jenö EgervĂĄry: from the origins of the Hungarian algorithm to satellite communication », Central European Journal of Operations Research, vol. 18, no 1,â , p. 47-58 (lire en ligne).