This commit is contained in:
parent
eb2ea1c6ac
commit
b2708fcd9c
1 changed files with 0 additions and 147 deletions
|
|
@ -1,147 +0,0 @@
|
|||
package ei.game.algo;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import ei.game.algo.AStarNeighbour.Location;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Árni Arent
|
||||
* @author Ziver Koc
|
||||
*
|
||||
*/
|
||||
public class AStarPathfinder{
|
||||
protected LinkedList<AStarNode> open;
|
||||
protected LinkedList<AStarNode> closed;
|
||||
private AStarNode start;
|
||||
private AStarNode goal;
|
||||
private AStarNode closest;
|
||||
|
||||
/**
|
||||
* Constructs a Pathfinder.
|
||||
*/
|
||||
public AStarPathfinder() {
|
||||
this.open = new LinkedList<AStarNode>();
|
||||
this.closed = new LinkedList<AStarNode>();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param from the goal to go from, the start Node (origin).
|
||||
* @param to the goal to go to, the destination Node.
|
||||
* @return a List containing the path of Nodes to travel to reach goal.
|
||||
*/
|
||||
public List<AStarNode> findPath(AStarNode start, AStarNode goal) {
|
||||
this.start = start;
|
||||
this.goal = goal;
|
||||
|
||||
return startSearch((AStarNode)start,(AStarNode)goal);
|
||||
|
||||
}
|
||||
|
||||
private List<AStarNode> startSearch(AStarNode start, AStarNode goal) {
|
||||
// Add the start node to the open list, initialize it.
|
||||
start.setParent(null); // make sure it does not have any parent defined.
|
||||
start.estimatedCostToGoal = start.getEstimatedCostTo(goal,start);
|
||||
start.costFromStart = 0;
|
||||
open.add(start);
|
||||
|
||||
AStarNode node = null;
|
||||
// Go through all the items in the open storage.
|
||||
int order = 0; // defines the order of which the nodes were visited (used in gui visuals)
|
||||
while (!open.isEmpty()) {
|
||||
// Let's retrieve the first item from the storage.
|
||||
node = (AStarNode) open.removeFirst();
|
||||
node.setVisited(true);
|
||||
node.setVisitOrder(order++);
|
||||
// calculates the nearest way to the destination
|
||||
if(closest == null || closest.estimatedCostToGoal > node.estimatedCostToGoal){
|
||||
closest = node;
|
||||
}
|
||||
|
||||
// Check if we found the goal.
|
||||
if (node == goal) {
|
||||
return constructPath(node);
|
||||
} else {
|
||||
// Let's go through all the neighbours of this node.
|
||||
Iterator<AStarNeighbour> i = node.getNeighbours().iterator();
|
||||
while (i.hasNext()) {
|
||||
AStarNeighbour neighbour = (AStarNeighbour) i.next();
|
||||
AStarNode neighbourNode = (AStarNode)neighbour.getNode();
|
||||
|
||||
/*
|
||||
* We do not want to visit blocked neighbours, so we skip
|
||||
* them. Also, if the neighbour node is neither in the
|
||||
* closed and the open storage then add it to the open
|
||||
* storage, and set it's parent.
|
||||
*/
|
||||
if(!neighbourNode.isBlocked()) {
|
||||
Location location = neighbour.getLocation();
|
||||
|
||||
float costFromStart = node.costFromStart + node.getCost(neighbourNode, location);
|
||||
boolean inClosed = closed.contains(neighbourNode);
|
||||
boolean inOpen = open.contains(neighbourNode);
|
||||
|
||||
if ((!inOpen && !inClosed) || costFromStart < neighbourNode.costFromStart) {
|
||||
neighbourNode.setParent(node);
|
||||
neighbourNode.costFromStart = costFromStart;
|
||||
neighbourNode.estimatedCostToGoal = neighbourNode.getEstimatedCostTo(goal,start);
|
||||
|
||||
if (inClosed) {
|
||||
closed.remove(neighbourNode);
|
||||
}
|
||||
if (!inOpen) {
|
||||
open.add(neighbourNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
closed.add(node);
|
||||
}
|
||||
}
|
||||
System.out.println("Path Not found!!");
|
||||
//return null;
|
||||
return constructPath(closest);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Constructs a path from a Node through any number of
|
||||
* Nodes to the goal Node.
|
||||
*
|
||||
* @param node the Node that contains the path back from the goal to the start.
|
||||
* @return a List containing the path of Nodes to travel to reach goal.
|
||||
*/
|
||||
protected List<AStarNode> constructPath(AStarNode node) {
|
||||
LinkedList<AStarNode> path = new LinkedList<AStarNode>();
|
||||
|
||||
while (node.getParent() != null) {
|
||||
node.setPartOfPath(true);
|
||||
path.addFirst(node);
|
||||
node = node.getParent();
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets all the nodes from the previous search.
|
||||
*
|
||||
*/
|
||||
protected void resetNodes() {
|
||||
if(goal != null) goal.reset();
|
||||
if(start != null) start.reset();
|
||||
|
||||
if(open != null) {
|
||||
open.clear();
|
||||
}
|
||||
// Go through all the items in the open storage.
|
||||
if(closed != null) {
|
||||
closed.clear();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue