This commit is contained in:
Georgia Koutsodima 2023-04-05 18:37:33 +02:00
parent 108e795bd9
commit c81a209b5a
2 changed files with 62 additions and 8 deletions

View file

@ -1,7 +1,14 @@
package org.insa.graphs.algorithm.shortestpath;
import org.insa.graphs.model.Node;
import org.insa.graphs.model.Arc;
import java.util.ArrayList;
import org.insa.graphs.algorithm.utils.BinaryHeap;
public class DijkstraAlgorithm extends ShortestPathAlgorithm {
public DijkstraAlgorithm(ShortestPathData data) {
super(data);
}
@ -9,8 +16,45 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm {
@Override
protected ShortestPathSolution doRun() {
final ShortestPathData data = getInputData();
/*nombre de nodes du graphe de data */
int n=data.getGraph().size();
ArrayList<Label> tab=new ArrayList<Label>();
BinaryHeap<Label> tas=new BinaryHeap<Label>();
ShortestPathSolution solution = null;
// TODO:
/*initialisation */
for (int i=0;i<n;i++){
tab.add(new Label(data.getGraph().get(i), false, Double.POSITIVE_INFINITY , null));
}
Label label_origine = tab.get(data.getOrigin().getId());
label_origine.setCoutmin(0);
Label label_dest =tab.get(data.getDestination().getId())
/*insertion de label origine dans le tas */
tas.insert(label_origine);
Label x;
while (label_dest.getMarque()==false && tas.isEmpty()==false) {
x=tas.deleteMin();
x.setMarque(true);
for (Arc suc:x.getSommet().getSuccessors() ) {
int index=suc.getDestination().getId();
if (!tab.get(index).getMarque()) {
if (tab.get(index).getCost()>x.getCost()+suc.getLength()) {
/*on vérifie si présent dans le tas ou pas en utilisant remove */
try {
tas.remove(tab.get(index));
} catch (Exception e) {
System.out.println("l'élement n'est pas dans la tas");
}
tab.get(index).setCoutmin(x.getCost()+suc.getLength());
/*insertion dans le tas */
tas.insert(tab.get(index));
}
}
}
}
return solution;
}

View file

@ -1,19 +1,20 @@
package org.insa.graphs.algorithm.shortestpath;
import org.insa.graphs.model.Node;
import org.insa.graphs.model.Arc;
public class Label{
public class Label implements Comparable<Label>{
/*sommet associé au label */
private Node sommet;
/*marque, vrai lorsque le coût min de ce sommet est définitivement connu par l'algorithme*/
private boolean marque;
/*valeur courante du plus court chemin */
private int coutmin;
private double coutmin;
/*sommet précédent sur le chemin correspondant au plus court chemin courant */
private Node pere;
private Arc pere;
/*Constructeur */
public Label(Node sommet, boolean marque, int coutmin, Node pere){
public Label(Node sommet, boolean marque, double coutmin, Arc pere){
this.sommet=sommet;
this.marque=marque;
this.coutmin=coutmin;
@ -22,14 +23,23 @@ public class Label{
/*méthodes */
/*récupérer le cout */
public int getCost() { return this.coutmin;}
public double getCost() { return this.coutmin;}
/*récupérer le cout réalisé */
public int getCout() { return this.coutmin;}
public double getCout() { return this.coutmin;}
/*récupérer le sommet du label */
public Node getSommet() { return this.sommet;}
/*récupérer la marque */
public boolean getMarque() { return this.marque;}
/*récupérer le père */
public Node getPere() { return this.pere;}
public Arc getPere() { return this.pere;}
public void setMarque(boolean m) {this.marque=m;}
public void setCoutmin(double c) {this.coutmin=c;}
public void setPere(Arc p) {this.pere=p;}
public void setSommet(Node s) {this.sommet=s;}
public int compareTo(Label other){
return Double.compare(getCost(), other.getCost());
}
}