Example #1
0
        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();
                    }
                }
            }
        }
Example #2
0
        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();
                    }
                }
            }
        }