static Node A_Star(Node root) { var goal = new Node(-1, Goal); Open.Add(root); while (Open.Count != 0) { var node = Open.First(); Closed.Add(node); Open.RemoveAt(0); if (node.Equals(goal)) { return(node); } foreach (var child in node.GenerateChildren()) { var nodeInOpen = Open.Where(x => x.Equals(child)).FirstOrDefault(); var nodeInClosed = Closed.Where(x => x.Equals(child)).FirstOrDefault(); if (child.Equals(goal)) { return(child); } if (nodeInOpen != null) { if (nodeInOpen.Level > child.Level) { Open.Remove(nodeInOpen); Open.Add(child); } } else if (nodeInClosed != null) { if (nodeInClosed.Level > child.Level) { Closed.Remove(nodeInClosed); Open.Add(child); } } else { Open.Add(child); } } Open.Sort((a, b) => a.FScore.CompareTo(b.FScore)); //Open= Open.OrderBy(x => x.FScore).ToList(); } Console.WriteLine("Unsolvable problem"); return(null); }
protected override void WhenRemovingClosed(Vector2Int v2i) { Closed.Remove(v2i); //remove all hidden from closed for (int i = 0; i < ClosedHiddenNeighbores[v2i].Count; i++) { Vector2Int current = ClosedHiddenNeighbores[v2i][i]; HiddenClosedRelations[current].Remove(v2i); //Debug.Log("removed from: " + current); } ClosedHiddenNeighbores.Remove(v2i); InvalidTiles[v2i.x, v2i.y] = true; }
protected virtual void ProcessChildNode(NodeRecord bestNode, NavigationGraphEdge connectionEdge) { //this is where you process a child node var childNode = GenerateChildNodeRecord(bestNode, connectionEdge); //Get the cost estimate for the end node NavigationGraphNode endNode = connectionEdge.ToNode; float endNodeCost = bestNode.gValue + connectionEdge.Cost; //If the node is closed we may have to skip, or remove it from the close list. if (Closed.contains(endNode)) { NodeRecord endNodeRecord = Closed.find(endNode); //should find this in the closed list if (endNodeRecord.gValue <= endNodeCost) { continue; } Closed.Remove(endNodeRecord); float endNodeHeuristic = endNodeRecord.fValue - endNodeRecord.gValue; } else if (Open.contains(endNode)) { NodeRecord endNodeRecord = Open.find(endNode); if (endNodeRecord.gValue <= endNodeCost) { continue; } float endNodeHeuristic = endNodeRecord.fValue - endNodeRecord.gValue; } else { NodeRecord endNodeRecord = new NodeRecord(); endNodeRecord.node = endNode; var endNodeHeuristic = this.Heuristic.H(endNode, GoalNode); endNodeRecord.gValue = endNodeCost; endNodeRecord.parent = bestNode; endNodeRecord.fValue = endNodeCost + endNodeHeuristic; if (!Open.contains(endNode)) { Open.Add(endNodeRecord); } } }
protected virtual void WhenRemovingClosed(Vector2Int v2i) { Closed.Remove(v2i); InvalidTiles[v2i.x, v2i.y] = true; }