AccueilđŸ‡«đŸ‡·Chercher

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.

Exemple de graphe biparti pondĂ©rĂ© (oublions l'agent 3). L'objectif de l'algorithme hongrois est de calculer un couplage parfait (chaque agent a une unique tĂąche, et chaque tĂąche est assignĂ©e Ă  un agent) de poids minimum (somme des arĂȘtes en rouge minimale).

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.

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

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Ă©.

0a2a3a4
b1b2b30
c1c2c30
d100d4

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Ă©.
×××
0a2a3a4
b1b2b30
c1c2c30
d100d4
  • 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'
××
0a2a3a4
b1b2b30
c1c2c30
d100'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 :

  1. Initialisation :
  2. Boucle : Tant que le graphe G constituĂ© des arĂȘtes (a,b) telles que ne contient pas de couplage parfait, faire :
    1. Chercher un ensemble S de A tel que S a plus de sommets que son voisinage N(S)[2].
    2. Fixer : .
    3. Modifier (u,v) de la maniĂšre suivante :
      • Si a est dans S,
      • Si b est dans le voisinage de S,
  3. 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) Cet article est partiellement ou en totalitĂ© issu de l’article de WikipĂ©dia en anglais intitulĂ© « Hungarian algorithm » (voir la liste des auteurs).
  1. (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, .
  2. Un tel ensemble existe d'aprÚs le théorÚme de Hall.
  3. (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
  4. (en) Harold W. Kuhn, « The Hungarian Method for the Assignment Problem: Introduction by Harold W. Kuhn », sur Tom Kelsey à l'Université de St Andrews.
  5. (en) James Munkres, Algorithms for the assignment and transportation Problem.
  6. (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).
Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.