Esempio n. 1
0
        public async Task <List <HSPNode> > PerformPlan(List <HSPPredicate> _init, List <HSPPredicate> _goal, List <HSPAction> _actions)
        {
            return(await Task.Run(() => solve()));

            List <HSPNode> solve()
            {
                List <HSPNode> plan = new List <HSPNode>();

                HashSet <string>         explored = new HashSet <string>();
                Dictionary <string, int> g_cost   = new Dictionary <string, int>();

                HashSet <string> goal  = groundPredicates(_goal);
                HSPNode          start = new HSPNode(groundPredicates(_init), null, null, 0, 0);

                Enqueue(start, start.getStateString());

                while (frontierQ.Count() > 0)
                {
                    HSPNode          node  = frontierQ.Dequeue();
                    HashSet <string> state = node.GetState();

                    explored.Add(node.getStateString());

                    if (ArrivedAtGoal(goal, state))
                    {
                        plan = node.getPath();
                        plan.Reverse();
                        return(plan);
                    }

                    foreach (HSPAction action in _actions)
                    {
                        if (action.isApplicableIn(state))
                        {
                            HashSet <string> newState = DeriveNewStateFromAction(action, state);

                            //#if node already explored, don't bother
                            string stateString = createStateString(newState);

                            if (!explored.Contains(stateString))
                            {
                                HSPNode new_node = new HSPNode(newState, action, node, (node.GetG() + 1), 0);

                                if (!g_cost.ContainsKey(stateString))
                                {
                                    g_cost.Add(stateString, new_node.GetG());
                                }

                                if (!enQueued.Contains(stateString) || new_node.GetG() < g_cost[stateString])
                                {
                                    Enqueue(new_node, stateString);
                                }
                            }
                        }
                    }
                }

                return(null);
            }
        }
Esempio n. 2
0
 private void Enqueue(HSPNode node, string stateString)
 {
     frontierQ.Enqueue(node);
     enQueued.Add(stateString);
 }