Académique Documents
Professionnel Documents
Culture Documents
Département d’Informatique
Filière Licence fondamentale
en Sciences Mathématiques et Informatique
intitulé :
2016 page 1
Résumé
1 Problème d’affectation 3
1.1 Introduction . . . . . . . . . . . . . . 3
1.2 Historique . . . . . . . . . . . . . . . 3
2 L’algorithme Hongrois 4
2.1 les étapes de l’algorithme : . . . . . . 4
2.2 Exemple . . . . . . . . . . . . . . . . 5
5 Conclusion 15
6 Annexe 17
6.1 Classe Cellule . . . . . . . . . . . . 17
6.2 Classe Matrhong : . . . . . . . . . 17
6.3 Classe main : . . . . . . . . . . . . 26
6.4 Classe interface : . . . . . . . . . . 26
TABLE DES MATIÈRES
Introduction générale
2016 page 2
1 PROBLÈME D’AFFECTATION
1 Problème d’affectation
1.1 Introduction
L’algorithme hongrois permet de résoudre le problème d’assi-
gnement. Si on considère deux ensembles A et B disjoints (de
même cardinal), et une fonction :
1.2 Historique
L’Algorithme Hongrois a été proposé en 1955 par le mathé-
maticien américain Harold Kuhn, qui l’a baptisé « méthode
hongroise » par ce qu’il s’appuyait sur des travaux antérieurs
de deux mathématiciens hongrois : Dénes Konig et Jen
Egerváry . James Munkres a revu l’algorithme en 1957 et a
prouvé qu’il s’exécutait en temps polynomial. L’algorithme
est vu comme une des premières apparitions de l’idée de
schéma primal-dual.
2016 page 3
2 L’ALGORITHME HONGROIS
2 L’algorithme Hongrois
2.1 les étapes de l’algorithme :
L’algorithme Hongrois peut être décrit de la façon suivante :
1. chacune des rangées, identifier le coût minimal et soustraire
celui-ci de chacun des coûts dans la rangée correspondante.
2. Dans chacune des colonnes, identifier le coût minimal et
soustraire celui-ci de chacun des coûts dans la colonne cor-
respondante.
3. Vérifier si une affectation de coût 0 est possible .Une façon
de procéder à cette vérification est d’identifier le nombre
minimum de lignes horizontales et verticales permettant
de « barrer » ou couvrir toutes les entrées nulles. Si ce
nombre minimum correspond au nombre de rangées dans
la matrice, alors une affectation de coût 0 est possible et
il faut aller en suite à l’étape 6 ; sinon il faut continuer à
l’étape 4.
4. Ajouter des entrées nulles dans la matrice de la façon sui-
vante :
• Identifier le plus petit coût non couvert dans la matrice.
• Soustraire le plus petit coût non couvert de chacune des
entrées non couvertes dans la matrice.
• Ajouter le plus petit coût non couvert aux entrées se
trouvant à l’intersection d’une ligne horizontale et verti-
cale (i.e., les entrées qui sont couvertes par deux lignes).
Il faut noter que les coûts dans les entrées couvertes par
une seule ligne ne changent pas.
5. 5. Répéter les étapes 3 et 4 jusqu’à ce qu’une affectation de
coût 0 soit possible.
6. Procéder à l’affectation optimale en considérant, une à une,
les entrées de coût nul. Pour ce faire, toujours donner la pré-
férence aux rangées et aux colonnes ayant une seule entrée
de coût nul. À chaque fois qu’une entrée est choisie, éliminer
la rangée et la colonne correspondante. Répéter jusqu’à ce
que toutes les rangées et colonnes aient été éliminées. Une
schématisation simpliste de l’algorithme hongrois pourrait
être la suivante :
2016 page 4
2 L’ALGORITHME HONGROIS
2.2 Exemple
Soit La société Beta possédant quatre ateliers : fonte,
moulage, laminage et traitement thermique, qu’on va
nommer respectivement F, M, L et T, pour lesquels elle
veut affecter quatre chef de service polyvalents, monsieur
A, B, C et D.
2016 page 5
2 L’ALGORITHME HONGROIS
2016 page 6
2 L’ALGORITHME HONGROIS
ÿ
þ
2016 page 7
2 L’ALGORITHME HONGROIS
2016 page 8
3 DIAGRAMME DE CLASSE :VUE GÉNÉRALE
Conception
2016 page 9
4 PRÉSENTATION DES IMPLÉMENTATION DES CLASSES DU
MODÈLE
2016 page 10
4 PRÉSENTATION DES IMPLÉMENTATION DES CLASSES DU
MODÈLE
méthodes :
• soustraireminligne(int min)
• soustrairemincolonne(int min)
ces deux méthodes prennent comme argument le
paramètre ‘min’ de type entier ;où il prend la valeur
0 en classe main ; on effet cette étape consiste à
éliminer le plus petit élément de chacune des lignes
puis celui de chacune des colonnes de la matrice par
la comparaison de chaque élément avec le min et le
soustraire de chaque ligne/colonne.
2016 page 11
4 PRÉSENTATION DES IMPLÉMENTATION DES CLASSES DU
MODÈLE
2016 page 12
4 PRÉSENTATION DES IMPLÉMENTATION DES CLASSES DU
MODÈLE
2016 page 13
4 PRÉSENTATION DES IMPLÉMENTATION DES CLASSES DU
MODÈLE
2016 page 14
5 CONCLUSION
5 Conclusion
2016 page 15
RÉFÉRENCES
Bibliographie
Références
2016 page 16
6 ANNEXE
6 Annexe
2016 page 17
6 ANNEXE
//constructeur
public matrhong(int dimension){
this.dimension=dimension;
tablecellule=new cellule[dimension][dimension];
Scanner in = new Scanner(System.in);
for(int i=0;i<dimension;i++){
for(int j=0;j<dimension;j++){
tablecellule[i][j] =new cellule( rand.
nextInt(30),"");
}}
copie();
}
les valeurs introduites dans la matrice saisie et enfin relever le minimum et le soustraire
des éléments de la même ligne. Complexité :O(n3)pour chaque ligne on doit faire n
2016 page 18
6 ANNEXE
2016 page 19
6 ANNEXE
]);
}
System.out.println();
}}
-Traitement : encadrer les zéros sélectionnés et non sélectionnés.
«V» : pour les zéros validés (encadré).
«NV» : pour les zéros non validés (non encadré).
//Etape d'encadrement
public void encadrerzero(){
int doub=0;//pour le traitement des zeros deja traites
int zeros=0;//compteur des zeros
int numligne=0 ;//l'indice de la ligne du zero encadre
int numcolonne=0;//l'indice de la colonne du zero encadre
for(int i=0;i<dimension;i++) {
zeros=0;
for(int j=0;j<dimension;j++) {
if(tablecellule[i][j].valeur==0)zeros
++;
}
if(zeros==1) {
numligne=i;
for(int j=0;j<dimension;j++){
if(tablecellule[i][j].valeur==0)
{
numcolonne=j;
tablecellule[numligne][numcolonne].
changereType("V");
} }}
for(int j=0;j<dimension;j++) {
if(tablecellule[numligne][j].valeur==0
&& j!=numcolonne) {
tablecellule[numligne][j].valeur
=−1;
System.out.println("nn ecadrer "
+numligne+" "+j);
tablecellule[numligne][j].
changereType("NV");
}}
for(int j=0;j<dimension;j++){
if(tablecellule[j][numcolonne].valeur
==0 && j!=numligne) {
tablecellule[j][numcolonne].
2016 page 20
6 ANNEXE
valeur=−1;
System.out.println("nn ecadrer "
+j+" "+numcolonne);
tablecellule[j][numcolonne].
changereType("NV");
}}}
for(int i=0;i<dimension;i++){
for(int j=0;j<dimension;j++) {
if(tablecellule[i][j].valeur==−1)
tablecellule[i][j].changerValeur
(0);
}}
//par colonne
for(int i=0;i<dimension;i++){
zeros=0;
for(int j=0;j<dimension;j++){
if(tablecellule[j][i].valeur==0)zeros
++;
}
if(zeros==1){
numcolonne=i;
for(int j=0;j<dimension;j++) {
if(tablecellule[j][i].valeur==0) {
numligne=j;
for(int k=0;k<dimension;k++) {
if(tablecellule[numligne][numcolonne].type.
equals("V"))
doub=1;
}
if(doub==0)
tablecellule[numligne][numcolonne].
changereType("V");
}
doub=0;
}
for(int j=0;j<dimension;j++){
if(tablecellule[numligne][j].valeur==0 && j!=
numcolonne) {
tablecellule[numligne][j].
changerValeur(−1);
for(int k=0;k<dimension;k++) {
if(tablecellule[numligne][j].type.equals("NV"))
doub=1;
}
for(int k=0;k<dimension;k++){
if(tablecellule[numligne][j].type
.equals("V"))
2016 page 21
6 ANNEXE
doub=1;
}
if(doub==0)
tablecellule[numligne][j].
changereType("NV");
doub=0;
}
}
for(int j=0;j<dimension;j++) {
if(tablecellule[j][numcolonne].valeur==0 && j
!=numligne){
tablecellule[j][numcolonne].
changerValeur(−1);
for(int k=0;k<dimension;k++){
if(tablecellule[j][numcolonne].type.equals
("NV"))
doub=1;
}
for(int k=0;k<dimension;k++) {
if(tablecellule[j][numcolonne].type.equals
("V"))
doub=1;
}
if(doub==0)
tablecellule[j][numcolonne].
changereType("NV");
doub=0;
}
}
}
}
for(int i=0;i<dimension;i++){
for(int j=0;j<dimension;j++){
if(tablecellule[i][j].valeur==−1)
tablecellule[i][j].changerValeur
(0);
}}
System.out.println("resultat d'encadrement");
for ( int i = 0 ; i < dimension ; i++ ) {
for (int j = 0 ; j <dimension ; j++ ) {
System.out.print("\t"+tablecellule[i][j
]);
}
System.out.println();
}
}
2016 page 22
6 ANNEXE
2016 page 23
6 ANNEXE
l)][i].valeur==0) {
indicecolonne.add(i);
} }}
for (int n= 0;n<indicecolonne.size();n++) {
for (int i= 0; i <dimension; i++) {
if(tablecellule[i][indicecolonne.get(n)].type.
equals("V")){
indiceligne.add(i);
}}}
System.out.println("les indices des lignes non
validees\t"+indiceligne.toString())
;
System.out.println("les indices des colonnes
validees\t"+indicecolonne.toString
());
for (int n= 0;n<dimension;n++){
for (int i= 0; i <dimension; i++){
for(int k=0;k<indiceligne.size()
−1;k++){
if (!indiceligne.contains
(n)){
tablecellule[n][i].changereType(tablecellule[n][i].
type+"brli");
} } }}
for (int n= 0;n<dimension;n++){
for (int i= 0; i <dimension; i++){
for(int k=0;k<indicecolonne.
size();k++) {
if (indicecolonne.
contains(n)){
tablecellule[i][n].changereType(tablecellule[i][n].type
+"brcol");
}}}}
for ( int i = 0 ; i < dimension ; i++ ) {
for (int j = 0 ; j <dimension ; j++ ) {
System.out.print("\t"+
tablecellule[i][j]);
}
System.out.println();
}
soutrajout();
}
return d;
}
2016 page 24
6 ANNEXE
recherche de la sous-matrice ; soustraire le min de cet sous matrice des éléments non
parcours de chaque ligne et chaque colonne pour relever le min et O(n2) encore une
fois le parcours pour la soustraction et O(n2)encore une fois pour l’addition Ceci donne
O(n2).
2016 page 25
6 ANNEXE
Class main où on fait l’appel des fonctions définissaient au niveau de la classe «Ma-
if(cpt>4){
System.out.println("cette matrice pas
optimal");
break;
}
}}
}
import javax.swing.∗;
import java.awt.∗;
2016 page 26
6 ANNEXE
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
2016 page 27
6 ANNEXE
pp2.add(l);
pp2.add(champ);
JPanel p1=new JPanel();
Entrer=new JButton("valider");
Entrer.addActionListener(this);
p1.add(Entrer);
//l'insertion des panneaux dans le panneau global.
panneauPri.add(p, BorderLayout.CENTER);
panneauPri.add(p1, BorderLayout.SOUTH);
pile = new CardLayout();
c.setLayout(pile);
c.add(panneauPri);
this.setSize(800, 350);
setResizable(false);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setDefaultCloseOperation(3);
return panneauPri;
}
public void actionPerformed(ActionEvent ev) {
int taille=0;
try{
taille=Integer.parseInt(champ.getText());
}
catch(Exception e){
JOptionPane.showMessageDialog(this, "Entrez la
taille de type Int","Erreur",0);
}
if(ev.getSource()==Entrer){
panneau6=new JEditorPane();
panneau6.setContentType("text/html");
panneau6.setEditable(false);
panneau6.setBackground(new Color(197, 181, 181,
1));
panneau6.setText("<h1><b><center> &
nbsp; Implementation, simulation et test
de l'algorithme Hongrois en JAVA  
; </center></b></h1>"
+ "<h2><center><u>Entrez les
elements : </u></center></h2
>");
panneau3=new JPanel();
panneau3.setLayout(new GridLayout(taille,
2016 page 28
6 ANNEXE
taille));
panneau3.setBorder(BorderFactory.
createEmptyBorder(30,40,40,20));
table=new JTextField[taille][taille];
for(int i=0;i<taille;i++){
for(int j=0;j<taille;j++){
table[i][j]=new JTextField(15);
panneau3.add(table[i][j]);
}
}
pann3=new JScrollPane(panneau3);
panneau5_1=new JPanel();
rechercher=new JButton("Debut de traitement");
rechercher.addActionListener(this);
panneau5_1.add(rechercher);
panneau5=new JPanel();
panneau5.setLayout(new BorderLayout());
panneau5.add(panneau6, BorderLayout.NORTH);
panneau5.add(pann3, BorderLayout.CENTER);
panneau5.add(panneau5_1, BorderLayout.SOUTH);
c.add(panneau5);
pile.next(c);
}
//l'action sur le bouton rechercher
if(ev.getSource()==rechercher){
Integer[][] table1=new Integer[taille][taille];
cellule[][] tab = null;
for(int i=0;i<taille;i++){
for(int j=0;j<taille;j++){
try{
table1[i][j]=Integer.
parseInt(table[i][j].
getText());
}
catch(Exception e){
JOptionPane.
showMessageDialog
(this, "Entrez
les elements de
type Int","
Erreur",0);
}}}
panneau7=new JEditorPane();
panneau7.setContentType("text/html");
panneau7.setEditable(false);
panneau7.setBackground(new Color(197, 181, 181,
1));
panneau7.setText("<h1><b><center> &
nbsp; Implementation, simulation et test
de l'algorithme Hongrois en JAVA  
2016 page 29
6 ANNEXE
; </center></b></h1>"
+ "<h2><center><u>La matrice
saisie : </u></center></h2>"
);
panneau8=new JPanel();
panneau8.setLayout(new BorderLayout());
panneau8.add(panneau7, BorderLayout.NORTH);
JPanel pan=new JPanel();
c.add(panneau8);
pile.next(c);
r=new matrhong(taille,table1);
r.copie();
pan.setLayout(new GridLayout(taille,taille));
panneau8.add(pan, BorderLayout.CENTER);
JPanel pann=new JPanel();
panneau8.add(pann, BorderLayout.SOUTH);
JLabel ress=new JLabel("");
pann.add(ress);
suiv=new JButton("suivant");
suiv.addActionListener(this);
pann.add(suiv);
for(int i=0;i<taille;i++){
for(int j=0;j<taille;j++){
tabl=r.table();
b= new JButton(""+tabl[i][j]);
b.setBackground(Color.white);
b.setPreferredSize(new Dimension(200,20));
pan.add(b);
}}}
//action sur le bouton suiv.
if(ev.getSource()==suiv){
panneau7=new JEditorPane();
panneau7.setContentType("text/html");
panneau7.setEditable(false);
panneau7.setBackground(new Color(197, 181, 181,
1));
panneau7.setText("<h1><b><center> &
nbsp; Implementation, simulation et test
de l'algorithme Hongrois en JAVA  
; </center></b></h1>"
+ "<h2><center><u>Etape 1 : </
u></center></h2>");
panneau8=new JPanel();
panneau8.setLayout(new BorderLayout());
panneau8.add(panneau7, BorderLayout.NORTH);
JPanel pan=new JPanel();
c.add(panneau8);
pile.next(c);
JPanel pan2=new JPanel();
JLabel res=new JLabel("");
2016 page 30
6 ANNEXE
pan.setLayout(new GridLayout(1,2));
panneau8.add(pan, BorderLayout.CENTER);
panneau8.add(pan2, BorderLayout.SOUTH);
suiv3=new JButton("Suivant");
suiv3.addActionListener(this);
pan2.add(res);
JPanel pan3=new JPanel();
JPanel pan4=new JPanel();
pan3.setLayout(new GridLayout(2,1));
JSplitPane pann=new JSplitPane(JSplitPane.
HORIZONTAL_SPLIT,pan3,pan4);
pan.add(pann);
JLabel txt1=new JLabel("<html><p> &
nbsp; Soustraire l'element minimal pour
chaque ligne :</p></html>");
pan3.add(txt1);
pan4.setLayout(new GridLayout(2,1));
JLabel txt2=new JLabel("<html><p> &
nbsp; Soustraire l'element minimal pour
chaque colonne :</p></html>");
pan4.add(txt2);
JLabel t1=new JLabel();
JLabel t2=new JLabel();
pan3.add(t1);
pan4.add(t2);
pan2.add(suiv3);
t1.setLayout(new GridLayout(taille,taille));
t2.setLayout(new GridLayout(taille,taille));
r.soustraireminlgne(0);
for(int i=0;i<taille;i++){
for(int j=0;j<taille;j++){
tabl=r.table();
b= new JButton(""+tabl[i][j]);
b.setBackground(Color.white);
if(tabl[i][j].type.equals("V"))
b.setForeground(Color.blue);
if(tabl[i][j].type.equals("NV"))
b.setForeground(Color.red);
t1.add(b);
}}
r.soustrairemincolonne(0);
for(int i=0;i<taille;i++){
for(int j=0;j<taille;j++){
tabl=r.table();
b= new JButton(""+tabl[i][j]);
b.setBackground(Color.white);
if(tabl[i][j].type.equals("V"))
b.setForeground(Color.blue);
if(tabl[i][j].type.equals("NV"))
b.setForeground(Color.red);
2016 page 31
6 ANNEXE
t2.add(b);
}
}}
if(ev.getSource()==suiv3){
panneau7=new JEditorPane();
panneau7.setContentType("text/html");
panneau7.setEditable(false);
panneau7.setBackground(new Color(197, 181, 181,
1));
panneau7.setText("<h1><b><center> &
nbsp; Implementation, simulation et test
de l'algorithme Hongrois en JAVA  
; </center></b></h1>"
+ "<h2><center><u>Resultat d'
encadrement : </u></center
></h2>");
panneau8=new JPanel();
panneau8.setLayout(new BorderLayout());
panneau8.add(panneau7, BorderLayout.NORTH);
JPanel pan=new JPanel();
c.add(panneau8);
pile.next(c);
JPanel pan2=new JPanel();
JLabel res=new JLabel("");
pan.setLayout(new GridLayout(taille,taille));
panneau8.add(pan, BorderLayout.CENTER);
panneau8.add(pan2, BorderLayout.SOUTH);
pan2.setLayout(new GridLayout(2,1));
suiv1=new JButton("Suivant");
suiv1.setVisible(false);
suiv1.addActionListener(this);
pan2.add(res);
pan2.add(suiv1);
r.soustraireminlgne(0);
r.soustrairemincolonne(0);
r.encadrerzezo();
for(int i=0;i<taille;i++){
for(int j=0;j<taille;j++){
tabl=r.table();
b= new JButton(""+tabl[i][j]);
b.setBackground(Color.white);
if(tabl[i][j].type.equals("V"))
b.setForeground(Color.blue);
if(tabl[i][j].type.equals("NV"))
b.setForeground(Color.red);
pan.add(b);
}}
r.traitement();
if(r.traitement()==true){
res.setText(r.getres()+"\n"+r.getopt());
2016 page 32
6 ANNEXE
}
else{
res.setText(r.getres());
suiv1.setVisible(true);
}
}
if(ev.getSource()==suiv1){
panneau7=new JEditorPane();
panneau7.setContentType("text/html");
panneau7.setEditable(false);
panneau7.setBackground(new Color(197, 181, 181,
1));
panneau7.setText("<h1><b><center> &
nbsp; Implementation, simulation et test
de l'algorithme Hongrois en JAVA  
; </center></b></h1>"
+ "<h2><center><u>
Traitement : </u></
center></h2>");
panneau8=new JPanel();
panneau8.setLayout(new BorderLayout());
panneau8.add(panneau7, BorderLayout.NORTH);
JPanel pan=new JPanel();
c.add(panneau8);
pile.next(c);
JPanel pan2=new JPanel();
JLabel res=new JLabel("");
pan.setLayout(new GridLayout(taille,taille));
panneau8.add(pan, BorderLayout.CENTER);
panneau8.add(pan2, BorderLayout.SOUTH);
pan2.add(res);
r.traitement();
int cpt=0;
while(r.traitement()==false) {
r.encadrerzezo();
cpt++;
if(cpt>4) {
res.setText("cette matrice pas
optimal");
break;
}}
for(int i=0;i<taille;i++){
for(int j=0;j<taille;j++){
tabl=r.table();
b= new JButton(""+tabl[i][j]);
b.setBackground(Color.white);
if(tabl[i][j].type.equals("V"))
b.setForeground(Color.blue);
if(tabl[i][j].type.equals("NV"))
b.setForeground(Color.red);
2016 page 33
6 ANNEXE
pan.add(b);
}}
if(r.traitement()==true){
res.setText(r.getres()+r.getopt());
}}}
public static void main(String[] args){
new hsd();
}
}
2016 page 34