public static Node <State> TreeSearchMetod(IProblem <State> problem, IFringe <Node <State> > fringe, Enum method) { Func <State, double> calculatePriorityForBestFirstSearch = newState => problem.CalculateDistanceToDestinyCity(newState); //odleglosc w lini prostej Func <Node <State>, State, double> calculatePriorityForAStar = (parent, newState) => problem.CalculatePriorityForAStar(parent.StateOfNode, newState); //Linia prosta + odleglosc krawedziowa, pozniej dodana jest //droga juz pokonana fringe.SetCompareMethod(ComparePriority); fringe.Add(new Node <State>(problem.InitialState, null, 1, double.MaxValue)); //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); } 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, node.StepsForSolution++, CalculatePriorityMethod(method, calculatePriorityForBestFirstSearch, calculatePriorityForAStar, node, actualState)); nodeToAdd.TotalRoad = node.TotalRoad + problem.GetDistanceToCity(node.StateOfNode, nodeToAdd.StateOfNode); fringe.Add(nodeToAdd); CountOfSteps++; } } } return(null); }