private void Search(State state, IGoal goal, int depth) { if (goal.Fulfillment(state) > bestscore) { bestscore = goal.Fulfillment(state); bestdepth = depth; bestActionStack = new Stack<PlanningAction>(planStack.Reverse()); bestStateStack = new Stack<State>(stateStack.Reverse()); } if (goal.Fulfillment(state) == bestscore && depth < bestdepth) { bestdepth = depth; bestActionStack = new Stack<PlanningAction>(planStack.Reverse()); bestStateStack = new Stack<State>(stateStack.Reverse()); } if (depth < _maxsearchdepth) { foreach (var a in state.PlanningActions.Where(l => l.CanExecute(state))) { var migratedState = a.Migrate(state); if(!stateStack.Contains(migratedState)) { planStack.Push(a); stateStack.Push(migratedState); Search(migratedState, goal, depth + 1); stateStack.Pop(); planStack.Pop(); } } } }
private void Search(State state, IGoal goal, int depth) { if (goal.Fulfillment(state) > bestscore) { bestscore = goal.Fulfillment(state); bestdepth = depth; bestActionStack = new Stack <PlanningAction>(planStack.Reverse()); bestStateStack = new Stack <State>(stateStack.Reverse()); } if (goal.Fulfillment(state) == bestscore && depth < bestdepth) { bestdepth = depth; bestActionStack = new Stack <PlanningAction>(planStack.Reverse()); bestStateStack = new Stack <State>(stateStack.Reverse()); } if (depth < _maxsearchdepth) { foreach (var a in state.PlanningActions.Where(l => l.CanExecute(state))) { var migratedState = a.Migrate(state); if (!stateStack.Contains(migratedState)) { planStack.Push(a); stateStack.Push(migratedState); Search(migratedState, goal, depth + 1); stateStack.Pop(); planStack.Pop(); } } } }