private Couple <int> AStarTreeSearch() { Console.WriteLine("A* Tree Search:"); SortedList <AStarTreeNode> openedNodes = new SortedList <AStarTreeNode>() { new AStarTreeNode(distanceMethod, 0, startPosition) }; int minSteps = -1; int examinedNodes = 0; while (openedNodes.Count > 0) { examinedNodes++; AStarTreeNode currentNode = openedNodes[0]; openedNodes.RemoveAt(0); if (IsGoal(currentNode)) { minSteps = currentNode.DistanceFromRoot; break; } openedNodes.AddAll(GetSuccessors(currentNode)); } return(new Couple <int>(minSteps, examinedNodes)); }
private List <AStarGraphNode> GetSuccessors(AStarTreeNode node) { Couple <int> pos = node.Coorditates; List <AStarGraphNode> successors = new List <AStarGraphNode>(); List <AStarGraphNode> nextPositions = new List <AStarGraphNode> { new AStarGraphNode(distanceMethod, node.DistanceFromRoot + 1, new Couple <int>(pos.First + 1, pos.Second)), new AStarGraphNode(distanceMethod, node.DistanceFromRoot + 1, new Couple <int>(pos.First - 1, pos.Second)), new AStarGraphNode(distanceMethod, node.DistanceFromRoot + 1, new Couple <int>(pos.First, pos.Second + 1)), new AStarGraphNode(distanceMethod, node.DistanceFromRoot + 1, new Couple <int>(pos.First, pos.Second - 1)) }; foreach (AStarGraphNode newPos in nextPositions) { if (IsValidPosition(newPos.Coorditates)) { successors.Add(newPos); } } return(successors); }
private int GetHeuristicDistance(AStarTreeNode node) => node.DistanceFromRoot + GetManhattanDistance(node.Coorditates);
private bool IsGoal(AStarTreeNode node) => endPosition == node.Coorditates;