private ISearch <EightPuzzleState> CreateSearch(Board initialBoard, Algorithm algorithm, HeuristicFunction heuristicFunction) { if (algorithm == Algorithm.AStar || algorithm == Algorithm.RecursiveBestFirstSearch) { IHeuristicFunction <EightPuzzleState> h; var goalBoard = Board.CreateGoalBoard(initialBoard.RowCount, initialBoard.ColumnCount); switch (heuristicFunction) { case HeuristicFunction.NoHeuristic: h = new NoHeuristicFunction <EightPuzzleState>(); break; case HeuristicFunction.ManhattanDistance: h = new ManhattanHeuristicFunction(goalBoard); break; case HeuristicFunction.NilssonHeuristic: h = new NilssonHeuristicFunction(goalBoard); break; case HeuristicFunction.RowColumnHeuristic: h = new RowColumnHeuristicFunction(goalBoard); break; default: throw new ArgumentOutOfRangeException(nameof(heuristicFunction), heuristicFunction, null); } switch (algorithm) { case Algorithm.AStar: return(new AStarSearch <EightPuzzleState>(h)); case Algorithm.RecursiveBestFirstSearch: return(new RecursiveBestFirstSearch <EightPuzzleState>(h)); default: throw new ArgumentOutOfRangeException(nameof(algorithm), algorithm, null); } } switch (algorithm) { case Algorithm.IterativeDeepeningSearch: return(new IterativeDeepeningSearch <EightPuzzleState>()); default: throw new ArgumentOutOfRangeException(nameof(algorithm), algorithm, null); } }
public void ShouldFindOptimal(Board board, int optimalSolution) { Assert.True(board.IsSolvable()); var problem = new EightPuzzleProblem(board); var h = new ManhattanHeuristicFunction(Board.CreateGoalBoard(board.RowCount, board.ColumnCount)); var algorithms = new ISearch <EightPuzzleState>[] { new AStarSearch <EightPuzzleState>(h), new RecursiveBestFirstSearch <EightPuzzleState>(h), }; foreach (var algorithm in algorithms) { var result = algorithm.Search(problem).ToList(); Assert.NotEmpty(result); Assert.Equal(optimalSolution, result.Count - 1); } }
public void ManhattanHeuristicFunctionTest( Board board, int expectedResult ) { var h = new ManhattanHeuristicFunction( Board.CreateGoalBoard( board.RowCount, board.ColumnCount ) ); Assert.Equal( expectedResult, h.Calculate( new EightPuzzleState( board ) ) ); }