Changement au niveau de label et de l'algo de Dijkstra
This commit is contained in:
parent
fefe2d3a62
commit
8a969440c8
2 changed files with 76 additions and 11 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue