public AStarSearch()
 {
     id             = "AS";
     name           = "A* Search";
     iterationCount = 0;
     category       = SearchCategory.Informed;
     Frontier       = new Frontier();
     Searched       = new List <MazeState>();
 }
 public GreedyBestFirstSearch()
 {
     id             = "GBFS";
     name           = "Greedy Best First Search";
     iterationCount = 0;
     category       = SearchCategory.Informed;
     Frontier       = new Frontier();
     Searched       = new List <MazeState>();
 }
 public BreadthFirstSearch()
 {
     id             = "BFS";
     name           = "Breadth-First Search";
     iterationCount = 0;
     category       = SearchCategory.Uninformed;
     Frontier       = new Frontier();
     Searched       = new List <MazeState>();
 }
        public UniformCostSearch()
        {
            id             = "UCS";
            name           = "Uniform Cost Search";
            iterationCount = 0;
            category       = SearchCategory.Uninformed;

            Frontier = new Frontier();
            Searched = new List <MazeState>();
        }
        public override bool AddToFrontier(MazeState aState, Frontier aFrontier = null)
        {
            Frontier selectedFrontier = aFrontier == null ? Frontier : aFrontier;

            if (selectedFrontier.Contains(aState) || Maze.Contains(aState, Searched))
            {
                return(false);
            }
            else
            {
                selectedFrontier.Enqueue(aState);
            }

            return(true);
        }
        public override Direction[] Solve(Maze aMaze)
        {
            //push the StartState to the frontier
            AddToFrontier(aMaze.StartState);

            while (!Frontier.Empty())
            {
                //Pop frontier state into curState
                MazeState curState = PopFrontier();

                //check if curState is a goalState
                //using a loop for each of the varient goal states listed
                for (int i = 0; i < aMaze.GoalStates.Length; i++)
                {
                    if (Maze.AreEqual(curState.State, aMaze.GoalStates[i].State))
                    {
                        Maze.OutputState(curState.State);
                        aMaze.FinalPathCost = curState.Cost;
                        Console.WriteLine($"Path cost: {aMaze.FinalPathCost}");
                        iterationCount++;
                        return(curState.GetPathFromParent());
                    }
                }

                //Find most desirable goal state - i.e. which is closes to the current state
                MazeState ClosestGoal = PickDesiredGoalState(curState, aMaze.GoalStates);

                //get all possible new states from curState
                List <MazeState> newStates = curState.CreatePossibleMoves();

                //add all children frontier
                foreach (MazeState s in newStates)
                {
                    //Need to implement a way to have a heuristic cost for each of the goal states
                    s.HeuristicCost = GetManhattanDistance(s, ClosestGoal);
                    AddToFrontier(s);
                }

                //Sort the frontier by f(n) = g(n) + h(n)
                Frontier.SortByEvaluationCost();
                iterationCount++;
            }
            return(null);
        }
        public override Direction[] Solve(Maze aMaze)
        {
            //ensure variable cost mode is on
            SearchMethod.VariableCost = true;

            AddToFrontier(aMaze.StartState);

            while (!Frontier.Empty())
            {
                //Pop frontier state into curState
                MazeState curState = Frontier.Pop();
                Searched.Add(curState);

                //check if curState is a goalState
                //using a loop for each of the varient goal states listed
                for (int i = 0; i < aMaze.GoalStates.Length; i++)
                {
                    if (Maze.AreEqual(curState.State, aMaze.GoalStates[i].State))
                    {
                        Maze.OutputState(curState.State);
                        aMaze.FinalPathCost = curState.Cost;
                        Console.WriteLine($"Path cost: {aMaze.FinalPathCost}");
                        iterationCount++;
                        return(curState.GetPathFromParent());
                    }
                }

                //get all possible new states from curState
                List <MazeState> newStates = curState.CreatePossibleMoves();

                foreach (MazeState s in newStates)
                {
                    AddToFrontier(s);
                }
                iterationCount++;

                Frontier.SortByCost();
            }

            return(null);
        }
        public override Direction[] Solve(Maze aMaze)
        {
            //push the StartState to the frontier
            AddToFrontier(aMaze.StartState);

            while (!Frontier.Empty())
            {
                //Pop frontier state into curState
                MazeState curState = Frontier.Dequeue();
                Searched.Add(curState);

                //check if curState is a goalState
                //using a loop for each of the varient goal states listed
                for (int i = 0; i < aMaze.GoalStates.Length; i++)
                {
                    if (Maze.AreEqual(curState.State, aMaze.GoalStates[i].State))
                    {
                        Maze.OutputState(curState.State);
                        aMaze.FinalPathCost = curState.Cost;
                        Console.WriteLine($"Path cost: {aMaze.FinalPathCost}");
                        iterationCount++;
                        return(curState.GetPathFromParent());
                    }
                }

                //get all possible new states from curState
                List <MazeState> newStates = curState.CreatePossibleMoves();
                newStates.Reverse(); //Reverse elements to ensure priority is U > L > D > R

                foreach (MazeState s in newStates)
                {
                    AddToFrontier(s);
                }
                iterationCount++;
            }

            return(null);
        }
 public void Reset()
 {
     Frontier       = new Frontier();
     Searched       = new List <MazeState>();
     iterationCount = 0;
 }
 public abstract bool AddToFrontier(MazeState aState, Frontier aFrontier = null);