Bonjour,
> Pfiou, avec toutes ces références, ca a l'air compliqué...Normalement on apprend cet algorithme en maîtrise d'informatique (dans
un cours de type 'algorithmique', 'recherche opérationnelle' ou
'optimisation combinatoire'). En DEA il est supposé connu même si pour
certains de petites (re)visions s'imposent.
> Il est faux mon algo ?Je n'en sais rien. C'est la première fois que j'entends parler de
résolution du couplage de coût maximal par une approche de
programmation dynamique mais sa complexité est la bonne (n^3).
L'algorithme hongrois est tellement efficace qu'il est rare que l'on
utilise autre chose.
lemmes préalables :
- On remarque qu'en soustrayant une valeur donnée à toute une ligne ou
à toute une colonne on ne change pas la solution finale
- On remarque que si l'on a une famille indépendante de n zéros (si on
mettait des tours d'échecs sur ces zéros, elles ne seraient pas
mutuellement en prise) on a une solution optimale
Algorithme :
i) soustraire autant de valeurs possibles aux lignes et au colonnes
afin de faire apparaître le plus grand nombre de zéros (tout en
gardant tous les coefficients positifs bien entendu) - il y a une
'méthode' systématique pour le faire par exemple soustraire le min
d'une ligne à toute la ligne puis d'une colonne à toute la colonne
ii) déterminer la cardinalité maximale k d'un ensemble de zéros
indépendants. Si k = n terminé, sinon, il faut couvrir tous les zéros
avec k traits (lignes ou colonnes) - techniquement parlant cette étape
construit un flot max puis détermine une coupe min.
iii) trouver la plus petite valeur non couverte
iv) soustraire cette valeur à tout le tableau et l'ajouter à toutes
les cases par lesquelles passe un 'trait' (si une case est à
l'intersection de deux traits il faut lui ajouter deux fois cette
valeur)
v) revenir en ii)
voir
http://www.public.iastate.edu/~ddoty/HungarianAlgorithm.htmlpour quelques figures et explications. Les étapes sont un peu
différentes car je les présente pour un déroulement 'à la main'. Je
reprends le même exemple
tableau initial
1 2 3
2 4 6
3 6 9
après i)
0 0 0
0 1 2
0 2 4
après ii)
k = 2
+ - -
| 1 2
| 2 4
iii) min = 1
après iv)
1 0 0
0 0 1
0 1 3
on a fini car on peut mettre des tours (d'échecs) sur la diagonale
. . T
. T .
T . .
sur la matrice initiale cela équivaut à un couplage de coût 10
Ces étapes peuvent paraître magiques mais elles ont une justification
théorique par la dualité en programmation linéaire et l'algorithme
primal-dual.
l'étape i) est ressemble à l'approche gloutonne
les étapes ii), iii) et iv) ont une propriété d'incrémentalité
(notamment quand on le présente sous la forme primal-dual) qui
rappelle il est vrai un peu la programmation dynamique (recherche du
second meilleur et calcul du coût réduit)
Diego Olivier