a star works perfectly

This commit is contained in:
Al-Akoum Abdelkader 2025-05-26 02:35:32 +02:00
parent 4e9989d7ae
commit a73f89d6db
2 changed files with 72 additions and 9 deletions

View file

@ -2,7 +2,7 @@
package org.insa.graphs.algorithm.shortestpath;
/*
import java.util.ArrayList;
import java.util.List;
@ -16,14 +16,14 @@ import org.insa.graphs.model.Graph;
import org.insa.graphs.model.Node;
import org.insa.graphs.model.Path;
*/
public class AStarAlgorithm extends DijkstraAlgorithm {
public AStarAlgorithm(ShortestPathData data) {
super(data);
}
}
/*
@Override
protected ShortestPathSolution doRun() {
@ -47,15 +47,78 @@ public class AStarAlgorithm extends DijkstraAlgorithm {
// Tas binaire pour l'extraction du label de coût f minimal
BinaryHeap<Label> heap = new BinaryHeap<>();
// Initialisation des labels : cout_estimee = distance à vol d'oiseau
for (Node node : graph.getNodes()) {
double cout_estimee = node.getPoint().distanceTo(destination.getPoint());
labels[node.getId()] = new LabelStar(node, cout_estimee);
}
// Origine : coût réel 0 on met un coût nul pour le sommet origine
labels[origin.getId()].setcoutrealise(0);
heap.insert(labels[origin.getId()]);
notifyOriginProcessed(origin);
Label current;
// Liste des arcs du chemin
List<Arc> cheminArcs = new ArrayList<>();
// Boucle principale : tant que tas non vide et destination non marquée
while (!heap.isEmpty() && !labels[destination.getId()].getmarque()) {
current = heap.deleteMin(); // on extrait le label avec le coût le plus faible f minimal = cout_realise + cout_estimee et on le supprime du tas
current.setmarque(true);
notifyNodeMarked(current.getsommetcourant());
for (Arc arc : current.getsommetcourant().getSuccessors()) {
if (!inspector.isAllowed(arc)) {//pour verifier si c pieton ou bien voiture
continue; //si on rentre pour faire continue,on passe a larc suivant dans la liste
}
Node succ= arc.getDestination();
LabelStar succLabel = labels[succ.getId()];
if (succLabel.getmarque()) {
continue; //si on rentre pour faire continue,on passe a larc suivant dans la liste
}
double cout_realise = current.getCost();
double costArc = data.getCost(arc);
double gNew = cout_realise + costArc;
if (gNew < succLabel.getCost()) {
succLabel.setcoutrealise(gNew);
succLabel.setarcperefils(arc);
notifyNodeReached(succ);
try {
heap.remove(succLabel);
heap.insert(succLabel);
} catch (ElementNotFoundException e) {
heap.insert(succLabel);
}
//return solution;
}
}
}
ShortestPathSolution solution;
if (!labels[destination.getId()].getmarque()) {
solution = new ShortestPathSolution(data, AbstractSolution.Status.INFEASIBLE);
} else {
notifyDestinationReached(destination);
// Reconstruction du chemin
Arc arc = labels[destination.getId()].getarcpere_fils();
while (arc != null) {
cheminArcs.add(0, arc);
arc = labels[arc.getOrigin().getId()].getarcpere_fils();
}
Path path = new Path(graph, cheminArcs);
solution = new ShortestPathSolution(data, AbstractSolution.Status.OPTIMAL, path);
}
return solution;
}
}
*/

View file

@ -1,6 +1,6 @@
package org.insa.graphs.algorithm.shortestpath;
import org.insa.graphs.model.Arc;
import org.insa.graphs.model.Node;
public class LabelStar extends Label{
@ -11,7 +11,7 @@ public class LabelStar extends Label{
this.cout_estimee = cout_estimee;
}
//Constructeur de copie pour cloner un LabelStar existant.
/*
public LabelStar(LabelStar other) {
super(other.getsommetcourant ());
// Recopie de tous les champs de Label
@ -20,7 +20,7 @@ public class LabelStar extends Label{
this.setarcperefils(other.getarcpere_fils());
// Recopie de l'heuristique
this.cout_estimee = other.cout_estimee;
}*/
}
//Setter
public void setCoutEstimee(double cout_estimee) {