public void SparseAndDenseSolversGiveSameResult()
        {
            var       rng          = new Random(42);
            const int numberOfRuns = 500;
            const int numRows      = 400;
            const int numCols      = 400;

            for (var run = 0; run < numberOfRuns; run++)
            {
                var dense = new double[numRows, numCols];
                for (var i = 0; i < numRows; i++)
                {
                    for (var j = 0; j < numCols; j++)
                    {
                        dense[i, j] = rng.Next(1, 100);
                    }
                }

                var sparse = new SparseMatrixDouble(dense);

                var solver       = new ShortestPathSolver();
                var denseResult  = solver.Solve(dense);
                var sparseResult = solver.Solve(sparse);
                // Check that all assignments agree. In principle, they don't have to if more than
                // one optimal solution exists, but this is somewhat unlikely when we're dealing
                // with random doubles.
                var denseObjective  = Enumerable.Range(0, numRows).Sum(i => dense[i, denseResult.ColumnAssignment[i]]);
                var sparseObjective = Enumerable.Range(0, numRows).Sum(i => dense[i, sparseResult.ColumnAssignment[i]]);
                Assert.Equal(denseObjective, sparseObjective);
            }
        }
        public void SolveThrowsWhenNoFeasibleSolutionExists()
        {
            var cost = new[, ] {
                { double.PositiveInfinity }
            };
            var solver = new ShortestPathSolver();

            Assert.Throws <InvalidOperationException>(() => solver.Solve(cost));
        }
Пример #3
0
        public void LoadMaze(IMaze maze, MazeStats mazeStats)
        {
            _currentMaze          = maze;
            _currentStats         = mazeStats;
            _mazeDistanceInfo     = CellDistanceSolver.GetPassableDistancesFromCell(_currentMaze.StartingCell);
            _mazeShortestPathInfo = ShortestPathSolver.Solve(_currentMaze.FinishingCell, _mazeDistanceInfo);

            UpdateMazeRendering();
            ResetMazePositionAndScaling();
        }
        public void SolveSparseGivesExpectedResult(
            double[,] dense,
            int[] expectedColumnAssignment,
            int[] expectedRowAssignment)
        {
            var solver   = new ShortestPathSolver();
            var cost     = new SparseMatrixDouble(dense);
            var solution = solver.Solve(cost);

            Assert.Equal(expectedColumnAssignment, solution.ColumnAssignment);
            Assert.Equal(expectedRowAssignment, solution.RowAssignment);
        }
        public void SolveThrowsForNonTrivialNonSquareInputWithoutFeasibleSolution()
        {
            var dense = new[, ]
            {
                { .2, double.PositiveInfinity, double.PositiveInfinity },
                { .3, double.PositiveInfinity, double.PositiveInfinity }
            };
            var sparse = new SparseMatrixDouble(dense);
            var solver = new ShortestPathSolver();

            Assert.Throws <InvalidOperationException>(() => solver.Solve(dense));
            Assert.Throws <InvalidOperationException>(() => solver.Solve(sparse));
        }
        public void SolveGivesExpectedResult(
            double[,] cost,
            int[] expectedColumnAssignment,
            int[] expectedRowAssignment,
            double[] expectedDualU,
            double[] expectedDualV)
        {
            var solver   = new ShortestPathSolver();
            var solution = solver.Solve(cost);

            Assert.IsAssignableFrom <AssignmentWithDuals>(solution);
            var solutionWithDuals = (AssignmentWithDuals)solution;

            Assert.Equal(expectedColumnAssignment, solution.ColumnAssignment);
            Assert.Equal(expectedRowAssignment, solution.RowAssignment);
            Assert.Equal(expectedDualU, solutionWithDuals.DualU);
            Assert.Equal(expectedDualV, solutionWithDuals.DualV);
        }
Пример #7
0
        static void Main(string[] args)
        {
            const string pngFileName = "rendering.png";

            var maze                 = new TriangleMaze(20, 40, WallSetupAlgorithm.RecursiveBackTracker);
            var mazeDistanceInfo     = CellDistanceSolver.GetPassableDistancesFromCell(maze.StartingCell);
            var mazeShortestPathInfo = ShortestPathSolver.Solve(maze.FinishingCell, mazeDistanceInfo);
            var renderOptions        = new RenderOptions
            {
                ShowGradientOfDistanceFromStart = true,
                HighlightShortestPath           = true,
                //ShowAllDistances = true,
            };

            using (var image = maze.RenderWithSkia(renderOptions, mazeDistanceInfo, mazeShortestPathInfo))
                using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
                    using (var stream = File.OpenWrite(pngFileName))
                    {
                        data.SaveTo(stream);
                    }
        }