コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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 ) ) );
        }