Changement au niveau de label et de l'algo de Dijkstra

This commit is contained in:
knzrd 2025-05-21 18:01:03 +02:00
parent fefe2d3a62
commit 8a969440c8
2 changed files with 76 additions and 11 deletions

View file

@ -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<nbNodes;i++) {
// On crée un tas vide de labels
BinaryHeap<Label> 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<nbNodes;i++){
if (labelcourant == tableau_label[i]){
}
}*/
// pour tous les successeurs du sommet qui a ce label on regarde le coût
// pour l'instant on n'essaye pas de gagner du temps sur la boucle for mais il serait
//intéressant de ne regarder que les labels non marqué
// pour l'ensemble des noeuds que j'ai
for (Node nodes : graph.getNodes()){
// pour l'ensemble des arts existants à partir du nodecourant
for (Arc arcscourants : labelcourant.getsommetcourant().getSuccessors()){
// si l'arc qu'on a est lié au noeud étudié alors on vérifie son coût
//if ()
}
}
}
/*// Retrieve weight of the arc.
double w = data.getCost(arc);
double oldDistance = distances[arc.getDestination().getId()];
double newDistance = distances[node.getId()] + w
// On met la valeur du label de l'origine à 0
// when the algorithm terminates, return the solution that has been found
*/
return solution;
}
}

View file

@ -1,11 +1,12 @@
package org.insa.graphs.algorithm.shortestpath;
import org.insa.graphs.model.Arc;
public class Label {
import org.insa.graphs.model.Node;
public class Label implements Comparable<Label>{
// 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
}