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;
    }
Пример #3
0
        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;
 }