예제 #1
0
        public static Node <State> TreeSearchMethod(IProblem <State> problem, IFringe <Node <State> > fringe, Enum method)
        {
            Func <Node <State>, int> calculatePriorityForBestFirstSearch = newState =>
                                                                           problem.CountOfConflicts(newState.StateOfNode);

            Func <Node <State>, int> calculatePriorityForAStar = newstate =>
                                                                 problem.CountDistancesToGoal(newstate.StateOfNode);


            fringe.SetCompareMethod(ComparePriority);

            var initNode = new Node <State>(problem.InitialState, null);

            initNode.Priority = CalculatePriorityMethod(method,
                                                        calculatePriorityForBestFirstSearch,
                                                        calculatePriorityForAStar, initNode);

            fringe.Add(initNode); ///tworzy root na stosie

            while (!fringe.IsEmpty)
            {
                var node = fringe.Pop();              //zdjecie ze stosu
                if (problem.IsGoal(node.StateOfNode)) //sprawdzenie zdjetego elementu ze stosu
                {
                    return(node);
                }

                problem.CountOfSteps++;

                foreach (var actualState in problem.Expand(node.StateOfNode))
                {
                    //foreach-a z możliwymy stanami, to tam sprawdzam czy dany stan z IListy
                    // już nie wystąpił, wywołując OnPathToRoot,
                    if (!node.OnPathToRoot(node.StateOfNode, actualState, problem.Compare))
                    //Wykonuje sie gdy nie ma znalezionego identycznego stanu
                    {
                        var nodeToAdd = new Node <State>(actualState, node);
                        nodeToAdd.Priority = CalculatePriorityMethod(method,
                                                                     calculatePriorityForBestFirstSearch,
                                                                     calculatePriorityForAStar, nodeToAdd);

                        fringe.Add(nodeToAdd);
                    }
                }
            }

            return(null);
        }