From 8a969440c87b319afaf0a86667e5b8e79f224d70 Mon Sep 17 00:00:00 2001 From: knzrd Date: Wed, 21 May 2025 18:01:03 +0200 Subject: [PATCH] Changement au niveau de label et de l'algo de Dijkstra --- .../shortestpath/DijkstraAlgorithm.java | 63 +++++++++++++++++-- .../graphs/algorithm/shortestpath/Label.java | 24 +++++-- 2 files changed, 76 insertions(+), 11 deletions(-) diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/DijkstraAlgorithm.java b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/DijkstraAlgorithm.java index f1e0952..0f2f4a2 100644 --- a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/DijkstraAlgorithm.java +++ b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/DijkstraAlgorithm.java @@ -1,7 +1,11 @@ package org.insa.graphs.algorithm.shortestpath; +import org.insa.graphs.algorithm.AbstractInputData; +import org.insa.graphs.algorithm.utils.BinaryHeap; import org.insa.graphs.model.Graph; import org.insa.graphs.model.Node; +import org.insa.graphs.model.Arc; +import org.insa.graphs.model.Path; public class DijkstraAlgorithm extends ShortestPathAlgorithm { @@ -29,13 +33,62 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm { // TODO: implement the Dijkstra algorithm // On crée un tableau de label avec un label pour chacun des noeuds :de 0 à N-1 Label tableau_label[] = new Label[nbNodes] ; - // on commence par mettre tous les label à +inf (soit ici la plus grande valeur possible) - for (int i=0;i tas = new BinaryHeap<>(); + // on crée une variable permettant d'avoir le dernier label utilisé + Label labelcourant; + // initialisation de Dijkstra + for (Node nodes :graph.getNodes()) { + // on indique à chaque label le sommet courant dont il s'occupe + // le constructeur utilisé indique directement qu'on ne connait pas l'arc pere, que le sommet + // n'est pas marqué et que le cout_courant est infini + tableau_label[nodes.getId()]= new Label(nodes); } + // on met un coût nul pour le sommet origine + tableau_label[origin.getId()].setcoutrealise(0); + // on met le label du sommet origine dans le tas + // il n'est pas nécessaire de réordonner le tas car cela est implémenté dans la méthode insert + tas.insert(tableau_label[origin.getId()]); + + // itération + // condition d'arrêt 1: tas vide (soit on a réellement fini soit le point de destination ne fait pas parti de la même composante connexe) + // condition d'arrêt 2: pour gagner du temps s'arrêter quand le sommet destination a été trouvé + while ((!tas.isEmpty()) && (tableau_label[destination.getId()].getmarque()==false)){ + // on extrait le label avec le coût le plus faible et on le supprime du tas + tas.findMin().setmarque(true); + labelcourant = tas.deleteMin(); + // marque le sommet du label qu'on vient de récupérer + /* for (int i=0;i{ // variables -// sommet associé à ce label - private int sommet_courant; +// sommet associé à ce label (pour l'instant choix d'un noeud) + private Node sommet_courant; // vrai lorsque le coût min du sommet est connu par l'algorithme private boolean marque; // valeur courant du plus court chemin depuis l'origine vers le sommet @@ -15,8 +16,15 @@ public class Label { // arc correspondant au chemin (le plus court car on peut avoir plusieurs arcs) du père vers le sommet courant private Arc arcpere_fils; + // constructeur de label qu'on va utiliser lors de l'initialisation de Dijkstra + public Label (Node sommet_courant){ + this.sommet_courant = sommet_courant; + this.marque = false; + this.cout_realise = Integer.MAX_VALUE; + this.arcpere_fils = null; + } //setter sommet courant - public void setsommetcourant (int sommet_courant) { + public void setsommetcourant (Node sommet_courant) { this.sommet_courant = sommet_courant; } //setter marque @@ -35,7 +43,7 @@ public class Label { } //getter sommet courant - public int getsommetcourant () { + public Node getsommetcourant () { return this.sommet_courant; } @@ -53,6 +61,10 @@ public class Label { public Arc arcpere_fils() { return this.arcpere_fils; } - + // on override la méthode de comparaison + @Override + public int compareTo(Label other){ + return Integer.compare(this.getCost(),other.getCost()); + } // ces labels sont associé à chaque noeud : les noeuds du graphes sont numérotés de 0 à N-1 }