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); } }
private void Enqueue(HSPNode node, string stateString) { frontierQ.Enqueue(node); enQueued.Add(stateString); }