Début AStar

This commit is contained in:
Marie Brunetto 2023-04-12 16:44:54 +02:00
parent 734fa38388
commit 70c2dfee46
2 changed files with 148 additions and 7 deletions

View file

@ -1,9 +1,134 @@
package org.insa.graphs.algorithm.shortestpath; package org.insa.graphs.algorithm.shortestpath;
import java.util.ArrayList;
import java.util.Collections;
import org.insa.graphs.model.Node;
import org.insa.graphs.model.Arc;
import org.insa.graphs.model.Path;
import org.insa.graphs.algorithm.AbstractSolution;
import org.insa.graphs.algorithm.utils.BinaryHeap;
public class AStarAlgorithm extends DijkstraAlgorithm { public class AStarAlgorithm extends DijkstraAlgorithm {
public AStarAlgorithm(ShortestPathData data) { public AStarAlgorithm(ShortestPathData data) {
super(data); super(data);
} }
public class DijkstraAlgorithm extends ShortestPathAlgorithm {
public DijkstraAlgorithm(ShortestPathData data) {
super(data);
}
@Override
protected ShortestPathSolution doRun() {
final ShortestPathData data = getInputData();
int tailleGraphe = data.getGraph().size();
int index = 0;
ArrayList<LabelStar> labelSommets = new ArrayList<LabelStar>();
LabelStar currentLabel;
BinaryHeap<LabelStar> leTas = new BinaryHeap<LabelStar>();
//Initialisation ----------------------------------------------------
Node currentNode = data.getDestination() ;
for(int i = 0; i< tailleGraphe; i++ )
{
currentLabel = new LabelStar(data.getGraph().get(i), currentNode);
labelSommets.add(currentLabel);
}
currentLabel = labelSommets.get(data.getOrigin().getId());
currentLabel.setNouveauChemin(null, 0);
currentLabel.setMarqueTrue();
leTas.insert(currentLabel);
currentNode = data.getOrigin() ;
double currentCost;
double newCost;
LabelStar newLabel;
notifyOriginProcessed(currentNode);
//Boucle principale ----------------------------------------------------
while (!leTas.isEmpty() && !currentNode.equals(data.getDestination()))
{
currentLabel = leTas.deleteMin();
currentNode = currentLabel.getSommetCourant();
index = currentNode.getId();
currentLabel.setMarqueTrue();
notifyNodeMarked(currentNode);
for(Arc arc : currentNode.getSuccessors())
{
if(data.isAllowed(arc))
{
newLabel = labelSommets.get(arc.getDestination().getId());
if(!newLabel.getMarque())
{
currentCost = newLabel.getTotalCost();
newCost = data.getCost(arc) + currentLabel.getTotalCost();
if(currentCost == -1.0)
{
newLabel.setNouveauChemin(arc, newCost);
leTas.insert(newLabel);
notifyNodeReached(newLabel.getSommetCourant());
}
else if(newCost < currentCost)
{
leTas.remove(newLabel);
newLabel.setNouveauChemin(arc, newCost);
leTas.insert(newLabel);
}
}
}
}
}
//Retour chemin obtenu ----------------------------------------------------
Node finalNode = data.getDestination();
index = 0;
ArrayList<Arc> arcListe = new ArrayList<Arc>() ;
if(labelSommets.get(data.getDestination().getId()).getCost() == -1)
{
return new ShortestPathSolution(data, AbstractSolution.Status.INFEASIBLE);
}
while(!finalNode.equals(data.getOrigin()) && index < tailleGraphe)
{
arcListe.add(labelSommets.get(finalNode.getId()).pere);
finalNode = arcListe.get(arcListe.size()-1).getOrigin();
index++;
}
if(index != tailleGraphe)
{
Collections.reverse(arcListe);
notifyDestinationReached(data.getDestination());
return new ShortestPathSolution(data, AbstractSolution.Status.FEASIBLE, new Path(data.getGraph(),arcListe ));
}
return new ShortestPathSolution(data, AbstractSolution.Status.INFEASIBLE);
}
}
} }

View file

@ -17,6 +17,13 @@ import org.insa.graphs.model.io.BinaryGraphReader;
import org.insa.graphs.model.io.BinaryPathReader; import org.insa.graphs.model.io.BinaryPathReader;
import org.insa.graphs.model.io.GraphReader; import org.insa.graphs.model.io.GraphReader;
import org.insa.graphs.model.io.PathReader; import org.insa.graphs.model.io.PathReader;
import org.insa.graphs.algorithm.ArcInspector;
import org.insa.graphs.algorithm.shortestpath.DijkstraAlgorithm;
import org.insa.graphs.algorithm.shortestpath.ShortestPathData;
/*
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;*/
public class Launch { public class Launch {
@ -47,31 +54,40 @@ public class Launch {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
// Visit these directory to see the list of available files on Commetud. // Visit these directory to see the list of available files on Commetud.
final String mapName = "/home/norgeux/Bureau/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps/insa.mapgr"; final String mapName = "/home/brunetto/Bureau/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps/insa.mapgr";
final String pathName = "/home/norgeux/Bureau/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Paths/path_fr31insa_rangueil_r2.path"; final String pathName = "/home/brunetto/Bureau/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Paths/path_fr31insa_rangueil_r2.path";
// Create a graph reader. // Create a graph reader.
final GraphReader reader = new BinaryGraphReader( final GraphReader reader = new BinaryGraphReader(
new DataInputStream(new BufferedInputStream(new FileInputStream(mapName)))); new DataInputStream(new BufferedInputStream(new FileInputStream(mapName))));
// TODO: Read the graph. // Read the graph.
final Graph graph = reader.read(); final Graph graph = reader.read();
// Create the drawing: // Create the drawing:
final Drawing drawing = createDrawing(); final Drawing drawing = createDrawing();
// TODO: Draw the graph on the drawing. // Draw the graph on the drawing.
drawing.drawGraph(graph); drawing.drawGraph(graph);
// TODO: Create a PathReader. // Create a PathReader.
final PathReader pathReader = new BinaryPathReader( final PathReader pathReader = new BinaryPathReader(
new DataInputStream(new BufferedInputStream(new FileInputStream(pathName)))); new DataInputStream(new BufferedInputStream(new FileInputStream(pathName))));
// TODO: Read the path. // Read the path.
final Path path = pathReader.readPath(graph); final Path path = pathReader.readPath(graph);
// TODO: Draw the path. // Draw the path.
drawing.drawPath(path); drawing.drawPath(path);
/*
protected final ArcInspector arcInspector;
ShortestPathData theData = new ShortestPathData(graph, path.getOrigin(), path.getDestination(), arcInspector);
DijkstraAlgorithm dji = new DijkstraAlgorithm(theData);
System.out.println("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");*/
} }
} }