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); }