astar now supports multiple consecutive runs

This commit is contained in:
Simon O'Shea
2023-08-09 09:48:55 -04:00
parent cd15c103c6
commit 4046a86cd1
@@ -11,12 +11,12 @@ public class Pathfinder
public static List<State> closed = new List<State>(); public static List<State> closed = new List<State>();
LogicGrid world; LogicGrid world;
public static Vector2Int agent; public Vector2Int agent;
public static List<Vector2Int> obstacles; public List<Vector2Int> obstacles;
public static List<Vector2Int> samples; public List<Vector2Int> samples;
public static int algorithm; // 0 = A* | 1 = dfs | 2 = bfs public int algorithm; // 0 = A* | 1 = dfs | 2 = bfs
public static int heuristic; // 0 = h0 | 1 = h1 | 2 = h2 public int heuristic; // 0 = h0 | 1 = h1 | 2 = h2
public static int height; public static int height;
public static int width; public static int width;
@@ -26,6 +26,8 @@ public class Pathfinder
public Pathfinder(LogicGrid world, Vector2Int a, List<Vector2Int> o, List<Vector2Int> s, int algo, int heu) public Pathfinder(LogicGrid world, Vector2Int a, List<Vector2Int> o, List<Vector2Int> s, int algo, int heu)
{ {
closed = new List<State>();
this.world = world; this.world = world;
height = world.GetHeight(); height = world.GetHeight();
width = world.GetWidth(); width = world.GetWidth();
@@ -59,31 +61,32 @@ public class Pathfinder
public void StartWork() public void StartWork()
{ {
Node initialState = new Node(null, agent, samples, '0', 0, 0); Node initialState = new Node(null, agent, obstacles, samples, '0', 0, 0);
result = new Stack<Node>(); result = new Stack<Node>();
// Run AStar // Run AStar
if (algorithm == 0) if (algorithm == 0)
{ {
result = StartAStar(initialState); result = StartAStar(initialState, heuristic);
} }
} }
public static Stack<Node> StartAStar(Node initialState) public static Stack<Node> StartAStar(Node initialState, int heuristic)
{ {
Debug.Log("GO!");
Stack<Node> solution = new Stack<Node>(); Stack<Node> solution = new Stack<Node>();
List<Node> open = new List<Node>(); List<Node> open = new List<Node>();
Debug.Log("GO!");
open.Add(initialState);
open.Add(initialState);
int cap = 1000; int cap = 1000;
while (true && cap > 0) while (true && cap > 0)
{ {
if (!open.Any()) if (!open.Any())
return solution; {
return solution;
}
open = open.OrderBy(Node => Node.fn).ToList(); open = open.OrderBy(Node => Node.fn).ToList();
@@ -201,7 +204,9 @@ public class Node
public static int col = 1; public static int col = 1;
public Node parent; public Node parent;
public Vector2Int agent; public Vector2Int agent;
public List<Vector2Int> obstacles;
public List<Vector2Int> samples; public List<Vector2Int> samples;
public char lastMove; // for output/animation public char lastMove; // for output/animation
@@ -211,10 +216,11 @@ public class Node
//bool canSample; // for expansion //bool canSample; // for expansion
// construct node :) // construct node :)
public Node(Node parent, Vector2Int agent, List<Vector2Int> samples, char lastMove, int distanceTraveled, double heuristic) public Node(Node parent, Vector2Int agent, List<Vector2Int> obstacles, List<Vector2Int> samples, char lastMove, int distanceTraveled, double heuristic)
{ {
this.parent = parent; this.parent = parent;
this.agent = agent; this.agent = agent;
this.obstacles = new List<Vector2Int>(obstacles);
this.samples = new List<Vector2Int>(samples); this.samples = new List<Vector2Int>(samples);
this.lastMove = lastMove; this.lastMove = lastMove;
this.distanceTraveled = distanceTraveled; this.distanceTraveled = distanceTraveled;
@@ -250,7 +256,7 @@ public class Node
if (isOpen(up)) if (isOpen(up))
{ {
// if move is valid, create that new node/state and document // if move is valid, create that new node/state and document
Node child = new Node(this, up, this.samples, 'U', this.distanceTraveled + 1, this.heuristic); Node child = new Node(this, up, this.obstacles, this.samples, 'U', this.distanceTraveled + 1, this.heuristic);
//SampleWorld.nodesGenerated++; //SampleWorld.nodesGenerated++;
// make sure that we have not already made that move // make sure that we have not already made that move
@@ -261,7 +267,7 @@ public class Node
// same idea but for the different potential moves // same idea but for the different potential moves
if (isOpen(down)) if (isOpen(down))
{ {
Node child = new Node(this, down, this.samples, 'D', this.distanceTraveled + 1, this.heuristic); Node child = new Node(this, down, this.obstacles, this.samples, 'D', this.distanceTraveled + 1, this.heuristic);
//SampleWorld.nodesGenerated++; //SampleWorld.nodesGenerated++;
if (!child.getState().inClosed()) if (!child.getState().inClosed())
@@ -270,7 +276,7 @@ public class Node
if (isOpen(left)) if (isOpen(left))
{ {
Node child = new Node(this, left, this.samples, 'L', this.distanceTraveled + 1, this.heuristic); Node child = new Node(this, left, this.obstacles, this.samples, 'L', this.distanceTraveled + 1, this.heuristic);
//SampleWorld.nodesGenerated++; //SampleWorld.nodesGenerated++;
if (!child.getState().inClosed()) if (!child.getState().inClosed())
@@ -279,7 +285,7 @@ public class Node
if (isOpen(right)) if (isOpen(right))
{ {
Node child = new Node(this, right, this.samples, 'R', this.distanceTraveled + 1, this.heuristic); Node child = new Node(this, right, this.obstacles, this.samples, 'R', this.distanceTraveled + 1, this.heuristic);
//SampleWorld.nodesGenerated++; //SampleWorld.nodesGenerated++;
if (!child.getState().inClosed()) if (!child.getState().inClosed())
@@ -290,7 +296,7 @@ public class Node
onSample = CanSample(); onSample = CanSample();
if (onSample.x == 1) if (onSample.x == 1)
{ {
Node child = new Node(this, this.agent, this.samples, 'S', this.distanceTraveled + 1, this.heuristic); Node child = new Node(this, this.agent, this.obstacles, this.samples, 'S', this.distanceTraveled + 1, this.heuristic);
child.samples.RemoveAt(onSample.y); child.samples.RemoveAt(onSample.y);
@@ -305,9 +311,9 @@ public class Node
public bool isOpen(Vector2Int position) public bool isOpen(Vector2Int position)
{ {
// check that agent is not trying to move into an obstacle // check that agent is not trying to move into an obstacle
for (int i = 0; i < Pathfinder.obstacles.Count(); i++) for (int i = 0; i < obstacles.Count(); i++)
{ {
if (Pathfinder.obstacles[i].x.Equals(position.x) && Pathfinder.obstacles[i].y.Equals(position.y)) if (obstacles[i].x.Equals(position.x) && obstacles[i].y.Equals(position.y))
return false; return false;
} }