Пример #1
0
        public AlgorithmRunResults GenerateMaze(IMazeCarver maze, MazeGenerationSettings settings)
        {
            var randomPoint = _randomPointGenerator.RandomPoint(maze.Size);

            maze.JumpToPoint(randomPoint);
            return(RecursiveBackTracker(maze));
        }
Пример #2
0
        public void RunForSettings(MazeGenerationSettings settings, bool parallel = false, int iterations = 100)
        {
            _outputWriter.Print("Random ");
            Settings2.ExtraWalls = WallCarverOption.Random;
            var results1 = RunExperiment(settings, iterations, parallel);

            _outputWriter.PrintLn("Finshed");

            _outputWriter.Print("Dead end ");
            Settings2.ExtraWalls = WallCarverOption.DeadEndWithPreferredDirection;
            var results2 = RunExperiment(settings, iterations, parallel);

            _outputWriter.PrintLn("Finshed");

            _outputWriter.Print("Dead end preferred ");
            Settings2.ExtraWalls = WallCarverOption.DeadEnd;
            var results3 = RunExperiment(settings, iterations, parallel);

            _outputWriter.PrintLn("Finshed");

            _outputWriter.Print("None ");
            Settings2.ExtraWalls = WallCarverOption.None;
            var results4 = RunExperiment(settings, iterations, parallel);

            _outputWriter.PrintLn("Finshed");

            _outputWriter.PrintLn($"Random");
            PrintResults(results1);
            _outputWriter.PrintLn($"Dead end");
            PrintResults(results2);
            _outputWriter.PrintLn($"Dead end preferred");
            PrintResults(results3);
            _outputWriter.PrintLn($"None");
            PrintResults(results4);
        }
        public AlgorithmRunResults GenerateMaze(IMazeCarver maze, MazeGenerationSettings settings)
        {
            var pointsAndDirections = new List <DirectionAndPoint>();

            _mazeHelper.DoForEachPoint(maze.Size, p =>
            {
                maze.JumpToPoint(p);
                var directions = _directions.Where(maze.CanCarveInDirection).ToList();
                _arrayHelper.Shuffle(directions);
                if (directions.Any())
                {
                    var first = directions.First();
                    pointsAndDirections.Add(new DirectionAndPoint {
                        Direction = first, MazePoint = maze.CurrentPoint
                    });
                    maze.CarveInDirection(first);
                }
            });

            return(new AlgorithmRunResults
            {
                Carver = maze,
                DirectionsCarvedIn = pointsAndDirections
            });
        }
 public IEnumerable <ValidationResult> ValidateSetting(MazeGenerationSettings settings)
 {
     if (settings.Algorithm == Algorithm.None)
     {
         yield return(new ValidationResult(null, false, "An Algorithm Has to be selected for the Maze Generation tool to run."));
     }
     if (settings.Size.X < 1)
     {
         yield return(new ValidationResult(null, false, "The X value must be greater than 0"));
     }
     if (settings.Size.X > 1000)
     {
         yield return(new ValidationResult(null, false, "The X value must be less than 1000"));
     }
     if (settings.Size.Y < 1)
     {
         yield return(new ValidationResult(null, false, "The Y value must be greater than 0"));
     }
     if (settings.Size.Y > 1000)
     {
         yield return(new ValidationResult(null, false, "The Y value must be less than 1000"));
     }
     if (settings.Size.Z < 1)
     {
         yield return(new ValidationResult(null, false, "The Z value must be greater than 0"));
     }
     if (settings.Size.Z > 1000)
     {
         yield return(new ValidationResult(null, false, "The Z value must be less than 1000"));
     }
     if (settings.Option == MazeType.None)
     {
         yield return(new ValidationResult(null, false, "A Model Option must be selected"));
     }
 }
Пример #5
0
 public void InitialiseOver(MazeGenerationSettings specificSettings, MazeGenerationSettings baseSettings)
 {
     specificSettings.Size        = baseSettings.Size ?? new MazeSize();
     specificSettings.Option      = baseSettings.Option;
     specificSettings.Algorithm   = baseSettings.Algorithm;
     specificSettings.DoorsAtEdge = baseSettings.DoorsAtEdge;
     specificSettings.AgentType   = baseSettings.AgentType;
 }
Пример #6
0
        public IEnumerable <ValidationResult> ValidateSetting(MazeGenerationSettings settings)
        {
            var results = _baseValidateSettings.ValidateSetting(settings);

            foreach (var result in results)
            {
                yield return(result);
            }
        }
Пример #7
0
        public AlgorithmRunResults GenerateMaze(IMazeCarver maze, MazeGenerationSettings settings)
        {
            var growingTreeSettings = settings as GrowingTreeSettings;

            if (growingTreeSettings == null)
            {
                throw new ArgumentException("The correct settings are not present");
            }
            return(GenerateMaze(maze, growingTreeSettings.Strategies));
        }
        public IEnumerable <ValidationResult> Validate(MazeGenerationSettings settings)
        {
            var validatorStrategy = _validators.SingleOrDefault(x => x.AlgorithmType == settings.Algorithm);

            if (validatorStrategy != null)
            {
                return(validatorStrategy.ValidateSetting(settings));
            }
            else
            {
                throw new ArgumentException("Unsupported Algorithm Type");
            }
        }
Пример #9
0
        private MazeResults BuildMaze(MazeGenerationSettings settings)
        {
            var result = _mazeGenerationFactory.GenerateMaze(settings);

            return(new MazeResults
            {
                ShortestPath = result.HeuristicsResults.ShortestPathResult.ShortestPath,
                Stats = result.HeuristicsResults.Stats,
                ModelTime = result.ModelTime,
                GenerationTime = result.GenerationTime,
                DeadEndFillerTime = result.DeadEndFillerTime,
                AgentGenerationTime = result.AgentGenerationTime,
                HeuristicsTime = result.HeuristicsTime,
                TotalTime = result.TotalTime,
                TotalCellsFilledIn = result.DeadEndFillerResults.TotalCellsFilledIn
            });
        }
Пример #10
0
        private ExperimentResult RunExperiment(MazeGenerationSettings settings, int iterations, bool parallel)
        {
            var batch = iterations / 100;
            int count = 0;
            List <MazeResults> items = null;

            if (parallel)
            {
                items = GenerateMazesParallel(settings, iterations).Select(x =>
                {
                    count++;
                    if (count % batch == 0)
                    {
                        _outputWriter.Print($"{count/batch}% ");
                    }

                    return(x);
                }).ToList();
            }
            else
            {
                items = GenerateMazes(settings, iterations).Select(x =>
                {
                    count++;
                    if (count % batch == 0)
                    {
                        _outputWriter.Print($"{count / batch}% ");
                    }

                    return(x);
                }).ToList();
            }
            var  doubleAverageTicks = _arrayHelper.Average(items, x => x.TotalTime.Ticks);
            long longAverageTicks   = Convert.ToInt64(doubleAverageTicks);
            var  result             = new ExperimentResult
            {
                AverageShortestPath   = _arrayHelper.Average(items, x => x.ShortestPath),
                AverageGenerationTime = new TimeSpan(longAverageTicks),
                DirectionWeightings   = _directionsFlagParser.Directions.ToDictionary(x => x, y => _arrayHelper.Average(items, z => z.Stats.DirectionsUsed[y])),
                AverageCellsFilledIn  = _arrayHelper.Average(items, x => x.TotalCellsFilledIn)
            };

            return(result);
        }
        public AlgorithmRunResults GenerateMaze(IMazeCarver maze, MazeGenerationSettings settings)
        {
            var pointAndDirection = new List <DirectionAndPoint>();
            var randomPoint       = _randomPointGenerator.RandomPoint(maze.Size);

            maze.JumpToPoint(randomPoint);
            var activeCells = new LinkedList <MazePoint>();

            activeCells.AddLast(randomPoint);
            while (activeCells.Any())
            {
                var currentPoint = activeCells.Last.Value;
                maze.JumpToPoint(currentPoint);
                var carvableDirections = maze.CarvableDirections().ToList();
                _arrayHelper.Shuffle(carvableDirections);
                var carved = false;
                foreach (var direction in carvableDirections)
                {
                    maze.JumpInDirection(direction);
                    var carvedDirections = maze.AlreadyCarvedDirections();
                    if (!carvedDirections.Any())
                    {
                        pointAndDirection.Add(new DirectionAndPoint {
                            Direction = direction, MazePoint = currentPoint
                        });
                        var oppositeDirection = _directionsFlagParser.OppositeDirection(direction);
                        maze.CarveInDirection(oppositeDirection);
                        activeCells.AddLast(maze.CurrentPoint);
                        carved = true;
                        break;
                    }
                    maze.JumpToPoint(currentPoint);
                }
                if (!carved)
                {
                    activeCells.RemoveLast();
                }
            }
            return(new AlgorithmRunResults
            {
                Carver = maze,
                DirectionsCarvedIn = pointAndDirection
            });
        }
        public void BuildMenu(Transform transform, MazeGenerationSettings existingSettings, Action <MazeGenerationSettings> settingsChanged)
        {
            _growingTreeSettings            = existingSettings as GrowingTreeSettings ?? new GrowingTreeSettings();
            _growingTreeSettings.Strategies = _growingTreeSettings.Strategies ?? new List <GrowingTreeStrategy>();
            _algorithmSettingsInitialiser.InitialiseOver(_growingTreeSettings, existingSettings);
            _growingTreeStrategyStorage.LoadStrategies(_growingTreeSettings.Strategies);

            _resourceLoader.InstantiateControl <TextControl>(transform).Initialize("Growing Tree Algorithm Settings");

            _resourceLoader.InstantiateControl <TextControl>(transform).Initialize("Cell selection weighting: the action will be randomly chosen ");

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Oldest", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.Oldest),
                        i => StrategyChanged(GrowingTreeStrategy.Oldest, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Newest", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.Newest),
                        i => StrategyChanged(GrowingTreeStrategy.Newest, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Middle", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.Middle),
                        i => StrategyChanged(GrowingTreeStrategy.Middle, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Randomness", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.Random),
                        i => StrategyChanged(GrowingTreeStrategy.Random, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Random Oldest Half", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.RandomOldest),
                        i => StrategyChanged(GrowingTreeStrategy.RandomOldest, i, settingsChanged));

            _resourceLoader.InstantiateControl <SliderControl>(transform)
            .Initialize("Random Newest Half", 0, 10,
                        _growingTreeStrategyStorage.Get(GrowingTreeStrategy.RandomNewest),
                        i => StrategyChanged(GrowingTreeStrategy.RandomNewest, i, settingsChanged));

            settingsChanged(GetSettings());
        }
        public IEnumerable <ValidationResult> ValidateSetting(MazeGenerationSettings settings)
        {
            var results = _baseValidateSettings.ValidateSetting(settings);

            foreach (var result in results)
            {
                yield return(result);
            }
            var growingTreeSettings = settings as GrowingTreeSettings;

            if (growingTreeSettings == null)
            {
                throw new ArgumentException("Settings must not be null");
            }
            if (!growingTreeSettings.Strategies.Any())
            {
                yield return(new ValidationResult(null, false, "There must be a weighted strategy with a value greater than 0"));
            }
        }
Пример #14
0
        public IModelBuilder BuildMaze(MazeGenerationSettings settings)
        {
            var pickType = PickType.Random;

            if (settings.DoorsAtEdge)
            {
                pickType = PickType.RandomEdge;
            }
            var startPoint = _randomPointGenerator.RandomPoint(settings.Size, pickType);
            var endPoint   = _randomPointGenerator.RandomPoint(settings.Size, pickType);

            while (startPoint.Equals(endPoint))
            {
                endPoint = _randomPointGenerator.RandomPoint(settings.Size, pickType);
            }
            var options = new ModelInitialisationOptions
            {
                Size       = settings.Size,
                StartPoint = startPoint,
                EndPoint   = endPoint
            };

            switch (settings.Option)
            {
            case MazeType.None:
                throw new ArgumentException("Maze Type None is not supported");

            case MazeType.UndirectedMaze:
                return(new Model2(_parser, _movementHelper, _mazeArrayBuilder).BaseInitialise(options));

            case MazeType.DirectedMaze:
                return(new Model1(_parser, _movementHelper, _mazeArrayBuilder).BaseInitialise(options));

            case MazeType.DictionaryMaze:
                return(new Model3(_parser, _pointFactory, _movementHelper).BaseInitialise(options));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Пример #15
0
        public MazeGenerationResults GenerateMaze(MazeGenerationSettings settings)
        {
            IMazeCarver carver         = null;
            var         modelBuildTime = _timeRecorder.GetRunningTime(() =>
            {
                var model = _mazeModelFactory.BuildMaze(settings);
                carver    = _mazeFactory.GetMazeCarver(model);
            });

            AlgorithmRunResults results = null;
            int extraWallsAdded         = 0;
            var generationTime          = _timeRecorder.GetRunningTime(() =>
            {
                switch (settings.Algorithm)
                {
                case Algorithm.None:
                    throw new ArgumentException("None not supported");

                case Algorithm.GrowingTreeAlgorithm:
                    results = _growingTreeAlgorithm.GenerateMaze(carver, settings);
                    break;

                case Algorithm.RecursiveBacktrackerAlgorithm:
                    results = _recursiveBacktrackerAlgorithm.GenerateMaze(carver, settings);
                    break;

                case Algorithm.BinaryTreeAlgorithm:
                    results = _binaryTreeAlgorithm.GenerateMaze(carver, settings);
                    break;

                default:
                    throw new ArgumentException("Unsupported algorithm type");
                }
                carver          = results.Carver;
                extraWallsAdded = _extraWall.Calulate(carver.Size);
                _randomCarver.CarveRandomWalls(carver, settings.ExtraWalls, extraWallsAdded);
            });

            DeadEndFillerResult deadEndFillerResults = null;
            var deadEndFillerTime = _timeRecorder.GetRunningTime(() =>
            {
                deadEndFillerResults = _deadEndFiller.Fill(carver);
            });
            AgentResults result = null;
            var          agentGenerationTime = _timeRecorder.GetRunningTime(() =>
            {
                if (settings.AgentType != AgentType.None)
                {
                    result = _agentFactory.MakeAgent(settings.AgentType).RunAgent(carver);
                }
            });

            HeuristicsResults heuristicsResults = null;
            var heuristicsTime = _timeRecorder.GetRunningTime(() =>
            {
                heuristicsResults = _heuristicsGenerator.GetResults(results);
            });

            var times     = new [] { modelBuildTime, generationTime, deadEndFillerTime, agentGenerationTime, heuristicsTime };
            var totalTime = times.Aggregate(new TimeSpan(), (seed, value) => seed.Add(value));

            return(new MazeGenerationResults
            {
                MazeJumper = carver.CarvingFinished(),
                HeuristicsResults = heuristicsResults,
                DirectionsCarvedIn = results.DirectionsCarvedIn,
                DeadEndFillerResults = deadEndFillerResults,
                ModelTime = modelBuildTime,
                AgentResults = result,
                GenerationTime = generationTime,
                DeadEndFillerTime = deadEndFillerTime,
                AgentGenerationTime = agentGenerationTime,
                HeuristicsTime = heuristicsTime,
                TotalTime = totalTime
            });
        }
 public ValidationResult ValidateAndProcess(MazeGenerationSettings settings)
 {
     return(_validationRetriever.GetOverallValidationResult(Validate(settings)));
 }
Пример #17
0
        public ExperimentRunner(IMazeGenerationFactory mazeGenerationFactory, IArrayHelper arrayHelper, IOutputWriter outputWriter, IDirectionsFlagParser directionsFlagParser)
        {
            _mazeGenerationFactory = mazeGenerationFactory;
            _arrayHelper           = arrayHelper;
            _outputWriter          = outputWriter;
            _directionsFlagParser  = directionsFlagParser;

            Settings1 = new MazeGenerationSettings
            {
                Algorithm   = Algorithm.BinaryTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = true,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                }
            };

            Settings2 = new MazeGenerationSettings
            {
                Algorithm   = Algorithm.BinaryTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = false,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                }
            };

            Settings3 = new MazeGenerationSettings
            {
                Algorithm   = Algorithm.RecursiveBacktrackerAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = true,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                }
            };

            Settings4 = new MazeGenerationSettings
            {
                Algorithm   = Algorithm.RecursiveBacktrackerAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = false,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                }
            };

            Settings5 = new GrowingTreeSettings
            {
                Algorithm   = Algorithm.GrowingTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = true,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                },
                Strategies = new List <GrowingTreeStrategy> {
                    GrowingTreeStrategy.Newest
                }
            };

            Settings6 = new GrowingTreeSettings
            {
                Algorithm   = Algorithm.GrowingTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = false,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                },
                Strategies = new List <GrowingTreeStrategy> {
                    GrowingTreeStrategy.Newest
                }
            };

            Settings7 = new GrowingTreeSettings
            {
                Algorithm   = Algorithm.GrowingTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = true,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                },
                Strategies = new List <GrowingTreeStrategy> {
                    GrowingTreeStrategy.Random
                }
            };

            Settings8 = new GrowingTreeSettings
            {
                Algorithm   = Algorithm.GrowingTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = false,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                },
                Strategies = new List <GrowingTreeStrategy> {
                    GrowingTreeStrategy.Random
                }
            };

            Settings9 = new GrowingTreeSettings
            {
                Algorithm   = Algorithm.GrowingTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = true,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                },
                Strategies = new List <GrowingTreeStrategy> {
                    GrowingTreeStrategy.Newest, GrowingTreeStrategy.Newest, GrowingTreeStrategy.Newest, GrowingTreeStrategy.RandomOldest, GrowingTreeStrategy.Middle
                }
            };

            Settings10 = new GrowingTreeSettings
            {
                Algorithm   = Algorithm.GrowingTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = false,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                },
                Strategies = new List <GrowingTreeStrategy> {
                    GrowingTreeStrategy.Newest, GrowingTreeStrategy.Newest, GrowingTreeStrategy.Newest, GrowingTreeStrategy.RandomOldest, GrowingTreeStrategy.Middle
                }
            };

            Settings11 = new GrowingTreeSettings
            {
                Algorithm   = Algorithm.GrowingTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = true,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                },
                Strategies = new List <GrowingTreeStrategy> {
                    GrowingTreeStrategy.Newest, GrowingTreeStrategy.Oldest
                }
            };

            Settings12 = new GrowingTreeSettings
            {
                Algorithm   = Algorithm.GrowingTreeAlgorithm,
                AgentType   = AgentType.None,
                DoorsAtEdge = false,
                ExtraWalls  = WallCarverOption.Random,
                Option      = MazeType.DirectedMaze,
                Size        = new MazeSize {
                    X = 25, Y = 25, Z = 25
                },
                Strategies = new List <GrowingTreeStrategy> {
                    GrowingTreeStrategy.Newest, GrowingTreeStrategy.Oldest
                }
            };
        }
 public void BuildMenu(Transform transform, Algorithm algorithm, MazeGenerationSettings existingSettings, Action <MazeGenerationSettings> settingsChanged)
 {
     transform.Clear();
     GetStrategy(algorithm).BuildMenu(transform, existingSettings, settingsChanged);
 }
Пример #19
0
 public IEnumerable <ValidationResult> ValidateSetting(MazeGenerationSettings settings)
 {
     return(_baseValidateSettings.ValidateSetting(settings));
 }
Пример #20
0
        private ParallelQuery <MazeResults> GenerateMazesParallel(MazeGenerationSettings settings, int iterations)
        {
            var itemsToProcess = iterations;

            return(Enumerable.Range(0, itemsToProcess).AsParallel().WithDegreeOfParallelism(4).Select(x => BuildMaze(settings)));
        }
Пример #21
0
        private IEnumerable <MazeResults> GenerateMazes(MazeGenerationSettings settings, int iterations)
        {
            var itemsToProcess = iterations;

            return(Enumerable.Range(0, itemsToProcess).Select(x => BuildMaze(settings)));
        }
 public void BuildMenu(Transform transform, MazeGenerationSettings existingSettings, Action <MazeGenerationSettings> settingsChanged)
 {
     _settings = existingSettings;
 }