Ce projet a pour but de partitionner des graphes connexes non-orientĂ©s en K classes afin dâobtenir un minimum dâarĂȘtes interclasses.
Nous allons pour cela utiliser un algorithme dâĂ©numĂ©ration, un algorithme glouton de descente de gradient, et les mĂ©ta-heuristiques recuit simulĂ© et recherche tabou.
Tous les rĂ©sultats et les temps dâexĂ©cution sont directement stockĂ©s dans un fichier.
Pour ce rapport, nous avons dĂ©cidĂ© dâanalyser les performances de nos algorithmes pour un partitionnement en K = 3 classes, mais bien entendu, nos programmes peuvent exĂ©cuter tout type de partitionnement allant de 1 jusquâau nombre de sommets du graphe Ă©tudiĂ©.
Pour une meilleure analyse, nous avons gĂ©nĂ©rĂ© jusqu'Ă 5 fois nos algorithmes afin dâobtenir un temps dâexĂ©cution minimum, maximum, et ainsi calculer la moyenne des temps dâexĂ©cution.
Il en est de mĂȘme pour le calcul du nombre des arĂȘtes interclasse.
Le projet est composé de 4 fichiers .cpp
, un par algorithme.
Afin d'executer nos progammes, depuis un terminal, se rendre dans le repertoir du .cpp
Ă l'aide de la commande cd
,
ce repertoire doit egalement contenir les .txt
des graphes, ils seront tous lu automatiquement.
Dans un terminal :
g++ -o nomDuFichier nomDuFichier.cpp
./nomDuFichier
Un fichier sera alors crée à coté du .cpp
contenant les solutions touvées par l'algorithme.
Nous avons dĂ©cidĂ© de gĂ©nĂ©rer toutes les solutions possibles de lâespace de recherche.
On appelle cette méthode énumération explicite.
Elle a pour but de parcourir toutes les solutions, vérifier leur validité et enfin stocker la meilleure solution parmi celles qui sont valides.
Nous pouvons constater au travers des rĂ©sultats, la complexitĂ© K nbsommets qui fait exploser le temps dâexĂ©cution de lâalgorithme, ce qui nous empĂȘche dâobtenir des rĂ©sultats pour un graphe ayant plus de 17 sommets.
Cet algorithme glouton a pour but dâamĂ©liorer la solution de maniĂšre successive jusquâĂ ce quâun minimum local ait Ă©tĂ© trouvĂ©. Pour avoir plus de chances de tomber sur la solution optimale, nous gĂ©nĂ©rons plusieurs fois une solution alĂ©atoire de dĂ©part afin de commencer notre descente en diffĂ©rents endroits.
En premier lieu on gĂ©nĂšre une solution alĂ©atoire quâon appelle solution de base.
Depuis cette solution de base, on explore tout son voisinage afin de trouver le meilleure solution voisine.
Pour le voisinage nous avons choisi dâutiliser la mĂ©thode swap qui consiste Ă Ă©changer deux sommets de classes diffĂ©rentes.
Nous avons utilisĂ© swap pour tout les algorithmes car il prĂ©sente lâavantage de ne pas modifier la structure de la solution et nous garantit de trouver une solution valide.
Si la solution trouvĂ©e amĂ©liore le rĂ©sultat, on recommence le processus jusquâĂ ce que la solution soit la meilleure de son voisinage.
Cet algorithme est une mĂ©ta-heuristique qui sâinspire de la physique et plus particuliĂšrement de la mĂ©tallurgie afin dâamĂ©liorer la qualitĂ©e dâun mĂ©tal.
En partant dâune haute tempĂ©rature Ă laquelle la matiĂšre est devenue liquide, la phase de refroidissement conduit la matiĂšre Ă retrouver sa forme solide par une diminution progressive de la tempĂ©rature jusquâĂ atteindre un Ă©tat dâĂ©nergie minimale qui correspond Ă une structure stable du mĂ©tal.
De la mĂȘme maniĂšre, la fonction qui Ă©value notre solution correspond Ă lâĂ©nergie et on crĂ©e un paramĂštre virtuel afin de gĂ©rer la tempĂ©rature. En premier lieu on gĂ©nĂšre une solution alĂ©atoire quâon appelle solution de base.
Ă partir de cette solution nous allons sur 10 paliers de tempĂ©ratures diffĂ©rents, suivant un schĂ©ma de refroidissement gĂ©omĂ©trique (t n+1 = t n â 0.9), gĂ©nĂ©rer 1000 voisins alĂ©atoires puis pour chaque voisin si la solution est amĂ©liorante alors on la prend, sinon on applique le critĂšre de Metropolis afin de savoir si on garde la solution ou pas.
Le critĂšre de Metropolis est une fonction stochastique qui dĂ©finit la probabilitĂ© dâaccepter une solution non amĂ©liorante.
Nous avons utilisé la recherche tabou par mouvement avec mémoire à court terme.
La liste tabou utilisée est de taille 8 et de type first in first out.
A chaque itĂ©ration on parcourt lâensemble des solutions voisines et choisit la meilleure qui nâest pas interdite, mĂȘme si elle est plus mauvaise que la solution courante.
Son avantage par rapport Ă la descente de gradient est que la liste tabou permet dâinterdire certaines solutions afin de ne pas rester bloquĂ© dans un minimum local et de changer de voisinage.
Le problĂšme de partitionnement de graphe demande beaucoup de ressources afin dâobtenir un rĂ©sultat optimal.
NĂ©anmoins il est possible dâapprocher au plus prĂšs de lâoptimal avec des temps raisonnables grĂące aux algorithmes gloutons et Ă des mĂ©ta-heuristiques.
Ce projet nous convainc de lâefficacitĂ© de ces mĂ©thodes, notamment celle du recuit simulĂ© qui nous a permis dâavoir un rĂ©sultat pour un graphe de 1000 sommets (ce qui aurais pris avec lâĂ©numĂ©ration un temps qui dĂ©passe les limites de ce projet).