示例#1
0
 public void Update(AINode newParent)
 {
     if (newParent.g + action.Cost < g)
     {
         parent = newParent;
         SetNodeActionDetails();
     }
 }
示例#2
0
 private bool AchievesPrecondition(AINode node)
 {
     foreach (var effect in node.GetAction().GetEffects())
     {
         if (currentNode.GetState().GetPreconditions().ContainsKey(effect.Key) && currentNode.GetState().GetPreconditions()[effect.Key].Equals(effect.Value))
         {
             return(true);
         }
     }
     return(false);
 }
示例#3
0
        private AINode FindCheapestNode()
        {
            AINode cheapestNode = openNodes[0];

            for (int i = 1; i < openNodes.Count; i++)
            {
                if (openNodes[i].GetFCost() < cheapestNode.GetFCost())
                {
                    cheapestNode = openNodes[i];
                }
            }
            return(cheapestNode);
        }
示例#4
0
        private void InitialiseNodeLists(AIAgent agent, AIPlanner planner)
        {
            nullNodes   = new List <AINode>();
            openNodes   = new List <AINode>();
            closedNodes = new List <AINode>();

            currentNode = new AINode(agent, planner);
            closedNodes.Add(currentNode);

            foreach (var action in agent.GetActions())
            {
                nullNodes.Add(new AINode(agent, planner, action));
            }
        }
示例#5
0
        private void InitialiseNodeLists(IAIAgent <L, V> agent, IAIGoal <L, V> goal)
        {
            nullNodes.Clear();
            openNodes.Clear();
            closedNodes.Clear();

            currentNode = new AINode <L, V>(agent, goal);
            closedNodes.Add(currentNode);

            foreach (var action in agent.Actions.GetActions())
            {
                nullNodes.Add(new AINode <L, V>(agent, goal, action));
            }
        }
示例#6
0
        public Queue <AIAction> GetActionPlan()
        {
            Queue <AIAction> queue = new Queue <AIAction>();

            while (currentNode.GetAction() != null)
            {
                queue.Enqueue(currentNode.GetAction());
                currentNode = currentNode.GetParent();
            }

            Queue <AIAction> actionPlan = new Queue <AIAction>();

            while (queue.Count > 0)
            {
                actionPlan.Enqueue(queue.Dequeue());
            }

            return(actionPlan);
        }
示例#7
0
        public Queue <IAIAction <L, V> > GetActionPlan()
        {
            var queue = new Queue <IAIAction <L, V> >();

            while (currentNode.GetAction() != null)
            {
                queue.Enqueue(currentNode.GetAction());
                currentNode = currentNode.GetParent();
            }

            var actionPlan = new Queue <IAIAction <L, V> >();

            while (queue.Count > 0)
            {
                actionPlan.Enqueue(queue.Dequeue());
            }

            return(actionPlan);
        }
示例#8
0
        public bool FindActionPlan(AIAgent agent, AIPlanner planner)
        {
            InitialiseNodeLists(agent, planner);

            while (!currentNode.ConditionsMet())
            {
                FindNeighbouringNodes();

                if (openNodes.Count == 0)
                {
                    return(false);
                }

                currentNode = FindCheapestNode();
                closedNodes.Add(currentNode);
                openNodes.Remove(currentNode);
            }

            return(true);
        }
示例#9
0
        public AINode(AIAgent agent, AIPlanner planner, AIAction action = null, AINode parent = null)
        {
            this.agent   = agent;
            this.planner = planner;
            this.action  = action;
            this.parent  = parent;

            if (action == null)
            {
                // This is a goal node
                state = new AIState(planner.GetGoal(), agent.GetMemory().CloneState());
                state.AddUnmetPreconditions(planner.GetGoal().GetConditions());
                g = 0;
            }
            else
            {
                // Initialise Action node
                state = new AIState();
                g     = float.MaxValue;
            }
        }