Un 'feedback vertex set' (FVS) d'un graphe est un sous ensemble de sommets qui contient au moins un sommet de chaque cycle dans le graphe. Le but est donc de trouver un 'feedback vertex set' de taille minimum. Nous travaillons sur un graphe non-orienté. Cette page présente une implémentation de l' algorithme Bafna-Berman-Fujito. Le langage Java est utilisé.
Le projet contient un build.xml avec les commandes suivantes :
- compile : compilation de l'interface de test et de l'algorithme
- run : lance l'interface de test de l'algorithme
Nous expliquons ici la structure de l'implémentation ainsi que des choix techniques effectués (structure de données..)
Cette class contient l'algorithme principal ainsi que les différentes méthodes nécessaires à son implémentation.
public ArrayList<Point> calculFVS( ArrayList<Point> points )
Méthode appelée par le GUI de test.
Parametres :
- points : les sommets du graphe
Retour : Un minimum feedback vertex set du graphe.
public ArrayList<Point> bbfAlgo( ArrayList<Point> points )
Implémentation de l'algorithme tel que décrit dans l'article
Une HashMap est utilisée pour associer un poids à un sommet. Ainsi l'obtention du poids d'un sommet se fait en 0(1). La structure de donnée HashSet de java est utilisée pour représenter des ensembles de sommets ( par exemple pour l'ensemble F). Cette structure de donnée offre des opérations d'ajout, suppression et d'appartenance en temps constant. De cette façon nous pouvons facilement tester l'appartenance d'un point particulier à cet ensemble en O(1).
Parametres :
- points : les sommets du graphe
Retour : Un minimum feedback vertex set du graphe.
public double min( ArrayList<Point> v , Map<Point , Double> weight )
Parametres :
- v : les sommets du graphe
- weight : les poids des sommets du graphe
Retour : min{weight(u) : u∈v}
public double min2( ArrayList<Point> v , Map<Point , Double> weight )
Parametres :
- v : les sommets du graphe
- weight : les poids des sommets du graphe
Retour : min{weight(u)/(d(u)−1) | u∈v}
public int d( Point p , ArrayList<Point> vertices )
Permet d'obtenir le degré d'un sommet du graphe.
Parametres :
- p : le sommet du graphe
- vertices : les sommets du graphe Retour : le degré de p dans vertices
public void cleanUp( ArrayList<Point> v )
Suppression de tous les sommets du graphe de degrés au plus 1. Correspond à la procedure Cleanup de l'article
Parametres :
- v : les sommets du graphe
public ArrayList<Point> semiDisjoint( ArrayList<Point> vertices )
Cherche un cycle semidisjoint C dans le graphe. C est semidisjoint si, pour chaque sommet u de C, d(u) = 2, avec au plus 1 exception. Etapes de la fonction :
- recherche d'un cycle dans le graphe
- Analyse du degré des sommets du cycle (si cycle il y a)
Parametres :
- vertices : les sommets du graphe
Retour : Un cycle semidisjoint s'il existe, null sinon
public ArrayList<Point> getCycle( ArrayList<Point> vertices )
Cherche un cycle dans le graphe. C'est un algorithme de parcours en profondeur récursif.
- Un HashSet est utilisé pour marquer les sommets visités. (test d'appartenance aux sommets visités effectué en temps constant grace à cette structure de données).
- Une pile Deque est utilisé pour 'sortir' le cycle trouvé à la fin de l'algorithme.
Parametres :
- vertices : les sommets du graphe
Retour : Un cycle
private boolean dfs( ArrayList<Point> g , Point v , Point father , Set<Point> visited , Deque<Point> stack )
Fonction appelée récursivement pour le parcours en profondeur du graphe.
Parametres :
- g : les sommets du graphe
- v : le sommet courant
- father : le dernier père visité du sommet courant
- visited : l'ensemble des sommets visités
- stack : contient le cycle à la fin de l'execution de l'algorithme s'il existe
Retour : Vrai si un cycle est détecté, faux sinon
Cette classe utilitaire contient des fonctions permettant d'évaluer la validité du FVS produit par l'algorithme.
private static boolean isMember( ArrayList<Point> points , Point p )
Permet de déterminer si un point p appartient à une liste de points
Parametres :
- p : le point à cherche
- points : l'ensemble de points à chercher
Retour : Vrai si p appartient à points, faux sinon
public static boolean isValide( ArrayList<Point> origPoints , ArrayList<Point> fvs )
Permet de tester si fvs est un fvs dans origPoints
Parametres :
- origPoints : l'ensemble de points
- fvs : le fvs à tester
Retour : Vrai si fvs est un minimum feedback vertex set dans origPoints.
public static ArrayList<Point> neighbor( Point p , ArrayList<Point> vertices )
Permet d'obtenir les voisins de p dans le graphe de vertices
Parametres :
- p : le point dont on souhaite obtenir les voisins
- vertices : les sommets du graphe
Retour : Une liste de points qui sont les voisins de p
Voici le résultat (à droite) de l'algorithme appliqué sur un graphe (à gauche).
Versions | Description |
---|---|
1.0 | Implémentation de l'algorithme Bafna-Berman-Fujito |
- Article de recherche de l'algorithme : https://www-apr.lip6.fr/~buixuan/files/aaga2015/FVS/vfs_bafna.pdf