#16 First astar implementation

This commit is contained in:
HU helene 2024-03-25 17:13:15 +01:00
parent 4d2ec04534
commit 14b080ff4d
4 changed files with 102 additions and 9 deletions

View file

@ -1,21 +1,83 @@
package fr.u_paris.gla.project.itinerary; package fr.u_paris.gla.project.itinerary;
import java.util.List; import java.util.*;
public class Finder <T extends GraphNode> {
private final Graph<T> graph;
public class Finder <T extends GraphNode<T>> {
private Graph<T> graph;
public Finder(Graph<T> graph) { public Finder(Graph<T> graph) {
this.graph = graph; this.graph = graph;
} }
public List<T> findPath(T from, T to) { public List<T> findPath(T startNode, T goalNode) {
// TODO PriorityQueue<T> openSet = new PriorityQueue<>(Comparator.comparingDouble(GraphNode::getF));
HashSet<T> closedSet = new HashSet<>();
HashMap<T, T> cameFrom = new HashMap<>();
HashMap<T, Double> gScore = new HashMap<>();
HashMap<T, Double> fScore = new HashMap<>();
// Initialize scores for all nodes to infinity
for (T node : graph.getNodes()) {
gScore.put(node, Double.POSITIVE_INFINITY);
fScore.put(node, Double.POSITIVE_INFINITY);
}
// The cost of going from start to start is zero
gScore.put(startNode, 0.0);
// For the first node, fScore = gScore + heuristic
fScore.put(startNode, startNode.getHeuristicCost(goalNode));
openSet.add(startNode);
while (!openSet.isEmpty()) {
T current = openSet.poll();
if (current.equals(goalNode)) {
return reconstructPath(cameFrom, current);
}
closedSet.add(current);
for (T neighbor : current.getNeighbors()) {
if (closedSet.contains(neighbor)) {
continue; // Ignore the neighbor which is already evaluated.
}
double tentativeGScore = gScore.get(current) + current.getCost(neighbor);
if (!openSet.contains(neighbor)) {
openSet.add(neighbor);
} else if (tentativeGScore >= gScore.get(neighbor)) {
continue; // This is not a better path.
}
// This path is the best until now. Record it!
cameFrom.put(neighbor, current);
gScore.put(neighbor, tentativeGScore);
fScore.put(neighbor, tentativeGScore + neighbor.getHeuristicCost(goalNode));
}
}
// If we reach here, it means there's no path from start to goal
return null; return null;
} }
public List<T> findPath(double longitude, double latitude) { private List<T> reconstructPath(HashMap<T, T> cameFrom, T current) {
// TODO List<T> totalPath = new ArrayList<>();
totalPath.add(current);
while (cameFrom.containsKey(current)) {
current = cameFrom.get(current);
totalPath.add(0, current); // Add to the beginning of the list to maintain order
}
return totalPath;
}
//TODO:
public List<T> findPath(double longitude, double latitude){
return null; return null;
} }
} }

View file

@ -12,4 +12,8 @@ public class Graph <T extends GraphNode> {
this.nodes = nodes; this.nodes = nodes;
this.connections = connections; this.connections = connections;
} }
public Set<T> getNodes() {
return nodes;
}
} }

View file

@ -1,7 +1,13 @@
package fr.u_paris.gla.project.itinerary; package fr.u_paris.gla.project.itinerary;
import java.util.List; import java.util.List;
import java.util.Set;
public interface GraphNode{ public interface GraphNode<T>{
int getId(); int getId();
double getHeuristicCost(T goalNode);
Set<T> getNeighbors();
double getCost(T neighbor);
double getF();
} }

View file

@ -27,6 +27,27 @@ public class Stop implements GraphNode {
return id; return id;
} }
@Override
public double getHeuristicCost(Object goalNode) {
return 0;
}
@Override
public Set getNeighbors() {
return lines;
}
@Override
public double getCost(Object neighbor) {
return 0;
}
@Override
public double getF() {
return 0;
}
public String getName(){ public String getName(){
return name; return name;
} }