public IGeneratorRunner GetGeneratorRunner(LevelDescriptionGrid2D <TNode> levelDescription) { if (benchmarkInitialization) { return(GetGeneratorRunnerWithInit(levelDescription)); } var configuration = this.configuration.SmartClone(); configuration.RoomsCanTouch = levelDescription.MinimumRoomDistance == 0; var mapDescription = levelDescription.GetMapDescription(); var chainDecompositionOld = new BreadthFirstChainDecompositionOld <TNode>(); var chainDecomposition = new TwoStageChainDecomposition <TNode>(mapDescription, chainDecompositionOld); configuration.Chains = chainDecomposition.GetChains(levelDescription.GetGraph()); configuration.SimulatedAnnealingConfiguration = new SimulatedAnnealingConfigurationProvider(new SimulatedAnnealingConfiguration() { MaxIterationsWithoutSuccess = 10000, }); var layoutDrawer = new SVGLayoutDrawer <TNode>(); var layoutGenerator = new DungeonGenerator <TNode>(mapDescription, configuration); layoutGenerator.InjectRandomGenerator(new Random(0)); return(new LambdaGeneratorRunner(() => { var simulatedAnnealingArgsContainer = new List <SimulatedAnnealingEventArgs>(); void SimulatedAnnealingEventHandler(object sender, SimulatedAnnealingEventArgs eventArgs) { simulatedAnnealingArgsContainer.Add(eventArgs); } layoutGenerator.OnSimulatedAnnealingEvent += SimulatedAnnealingEventHandler; var layout = layoutGenerator.GenerateLayout(); layoutGenerator.OnSimulatedAnnealingEvent -= SimulatedAnnealingEventHandler; var additionalData = new AdditionalRunData <TNode>() { SimulatedAnnealingEventArgs = simulatedAnnealingArgsContainer, GeneratedLayoutSvg = layout != null ? layoutDrawer.DrawLayout(layout, 800, forceSquare: true) : null, GeneratedLayout = layout, }; var generatorRun = new GeneratorRun <AdditionalRunData <TNode> >(layout != null, layoutGenerator.TimeTotal, layoutGenerator.IterationsCount, additionalData); return generatorRun; })); }
protected override DungeonGeneratorConfiguration <int> GetBasicConfiguration(NamedMapDescription namedMapDescription) { var configuration = base.GetBasicConfiguration(namedMapDescription); var chainDecompositionOld = new BreadthFirstChainDecompositionOld <int>(); var chainDecomposition = new TwoStageChainDecomposition <int>(namedMapDescription.MapDescription, chainDecompositionOld); var chains = chainDecomposition.GetChains(namedMapDescription.MapDescription.GetGraph()); configuration.Chains = chains; return(configuration); }
private DungeonGeneratorConfiguration <int> GetChainsConfiguration(NamedMapDescription namedMapDescription) { var chainDecompositionOld = new BreadthFirstChainDecomposition <int>(new ChainDecompositionConfiguration()); var chainDecomposition = new TwoStageChainDecomposition <int>(namedMapDescription.MapDescription, chainDecompositionOld); var configuration = GetOldConfiguration(namedMapDescription); configuration.Chains = chainDecomposition.GetChains(namedMapDescription.MapDescription.GetGraph()); return(configuration); }
private DungeonGeneratorConfiguration <int> GetOldConfiguration(NamedMapDescription namedMapDescription) { var chainDecompositionOld = new BreadthFirstChainDecompositionOld <int>(); var chainDecomposition = new TwoStageChainDecomposition <int>(namedMapDescription.MapDescription, chainDecompositionOld); var configuration = GetBasicConfiguration(namedMapDescription); configuration.Chains = chainDecomposition.GetChains(namedMapDescription.MapDescription.GetGraph()); configuration.SimulatedAnnealingConfiguration = new SimulatedAnnealingConfigurationProvider(new SimulatedAnnealingConfiguration() { MaxIterationsWithoutSuccess = 10000, }); return(configuration); }
private IMutation <TConfiguration> GetMutation(int priority, int maxTreeSize, bool mergeSmallChains, bool startTreeWithMultipleVertices, TreeComponentStrategy treeComponentStrategy) { var configuration = new ChainDecompositionConfiguration() { MaxTreeSize = maxTreeSize, MergeSmallChains = mergeSmallChains, StartTreeWithMultipleVertices = startTreeWithMultipleVertices, TreeComponentStrategy = treeComponentStrategy, }; var chains = new TwoStageChainDecomposition <TNode>(mapDescription, new BreadthFirstChainDecomposition <TNode>(configuration)) .GetChains(mapDescription.GetGraph()).ToList(); return(new ChainDecompositionMutation <TConfiguration, TNode>(priority, chains, maxTreeSize, mergeSmallChains, startTreeWithMultipleVertices, treeComponentStrategy)); }
private void SetupGenerator() { var mapping = mapDescription.GetMapping(); var chainsGeneric = configuration.Chains; if (chainsGeneric == null) { var chainDecomposition = new TwoStageChainDecomposition <TNode>(mapDescriptionOriginal, new BreadthFirstChainDecomposition <TNode>(configuration.ChainDecompositionConfiguration ?? new ChainDecompositionConfiguration())); chainsGeneric = chainDecomposition.GetChains(mapDescriptionOriginal.GetGraph()); } var chains = chainsGeneric .Select(x => new Chain <int>(x.Nodes.Select(y => mapping[y]).ToList(), x.Number)) .ToList(); var generatorPlanner = new GeneratorPlanner <Layout <Configuration <CorridorsData> >, int>(configuration.SimulatedAnnealingMaxBranching); var configurationSpacesGenerator = new ConfigurationSpacesGenerator( new PolygonOverlap(), DoorHandler.DefaultHandler, new OrthogonalLineIntersection(), new GridPolygonUtils()); var configurationSpaces = configurationSpacesGenerator.GetConfigurationSpaces <Configuration <CorridorsData> >(mapDescription); //var corridorConfigurationSpaces = mapDescription.IsWithCorridors ? configurationSpacesGenerator.Generate<TNode, Configuration<CorridorsData>>(mapDescription, mapDescription.CorridorsOffsets) : configurationSpaces; var corridorConfigurationSpaces = configurationSpaces; var averageSize = configurationSpaces.GetAverageSize(); var polygonOverlap = new FastPolygonOverlap(); var stageOneConstraints = new List <INodeConstraint <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, CorridorsData> > { new BasicConstraint <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, CorridorsData, IntAlias <PolygonGrid2D> >( new FastPolygonOverlap(), averageSize, configurationSpaces ), new CorridorConstraints <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, CorridorsData, IntAlias <PolygonGrid2D> >( mapDescription, averageSize, corridorConfigurationSpaces ), }; if (!configuration.RoomsCanTouch) { stageOneConstraints.Add(new TouchingConstraints <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, CorridorsData, IntAlias <PolygonGrid2D> >( mapDescription, polygonOverlap )); } var stageOneConstraintsEvaluator = new ConstraintsEvaluator <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, IntAlias <PolygonGrid2D>, CorridorsData>(stageOneConstraints); //if (mapDescription.IsWithCorridors) //{ // layoutOperations.AddNodeConstraint(new CorridorConstraints<Layout<Configuration<CorridorsData>>, int, Configuration<CorridorsData>, CorridorsData, IntAlias<GridPolygon>>( // mapDescription, // averageSize, // corridorConfigurationSpaces // )); // if (!false) // TODO: // { // var polygonOverlap = new FastPolygonOverlap(); // layoutOperations.AddNodeConstraint(new TouchingConstraints<Layout<Configuration<CorridorsData>>, int, Configuration<CorridorsData>, CorridorsData, IntAlias<GridPolygon>>( // mapDescription, // polygonOverlap // )); // } //} var roomShapesHandler = new RoomShapesHandler <int, Configuration <CorridorsData> >( configurationSpaces, configurationSpaces.GetIntAliasMapping(), mapDescription, configuration.RepeatModeOverride ); var layoutOperations = new LayoutOperations <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData>, IntAlias <PolygonGrid2D>, CorridorsData>(corridorConfigurationSpaces, configurationSpaces.GetAverageSize(), mapDescription, stageOneConstraintsEvaluator, stageOneConstraintsEvaluator, roomShapesHandler, configuration.ThrowIfRepeatModeNotSatisfied); var initialLayout = new Layout <Configuration <CorridorsData> >(mapDescription.GetGraph()); var layoutConverter = new BasicLayoutConverter <Layout <Configuration <CorridorsData> >, TNode, Configuration <CorridorsData> >(mapDescription, configurationSpaces, configurationSpaces.GetIntAliasMapping()); var layoutEvolver = new PlatformersEvolver <Layout <Configuration <CorridorsData> >, int, Configuration <CorridorsData> >(layoutOperations); generator = new ChainBasedGenerator <Layout <Configuration <CorridorsData> >, MapLayout <TNode>, int>(initialLayout, generatorPlanner, chains, layoutEvolver, layoutConverter); generator.OnRandomInjected += (random) => { ((IRandomInjectable)configurationSpaces).InjectRandomGenerator(random); ((IRandomInjectable)layoutOperations).InjectRandomGenerator(random); ((IRandomInjectable)layoutEvolver).InjectRandomGenerator(random); ((IRandomInjectable)layoutConverter).InjectRandomGenerator(random); }; generator.OnCancellationTokenInjected += (token) => { ((ICancellable)generatorPlanner).SetCancellationToken(token); ((ICancellable)layoutEvolver).SetCancellationToken(token); }; // layoutEvolver.OnEvent += (sender, args) => OnSimulatedAnnealingEvent?.Invoke(sender, args); layoutEvolver.OnPerturbed += (sender, layout) => OnPerturbed?.Invoke(layoutConverter.Convert(layout, false)); layoutEvolver.OnPerturbed += (sender, layout) => OnPerturbedInternal?.Invoke(layout); layoutEvolver.OnValid += (sender, layout) => OnPartialValid?.Invoke(layoutConverter.Convert(layout, true)); generatorPlanner.OnLayoutGenerated += layout => OnValid?.Invoke(layoutConverter.Convert(layout, true)); }
public void Run() { var count = 20; var name = "edges_0_3"; var graphs = GetGraphs(count, name); var inputs = new List <DungeonGeneratorInput <int> >(); var chainDecompositionOld = new BreadthFirstChainDecompositionOld <int>(); for (var i = 0; i < graphs.Count; i++) { var graph = graphs[i]; for (int j = 0; j < 1; j++) { var withCorridors = j == 1; var mapDescription = GetMapDescription(graph, withCorridors); var chainDecomposition = new TwoStageChainDecomposition <int>(mapDescription, chainDecompositionOld); inputs.Add(new DungeonGeneratorInput <int>($"RandomGraph {i} {(withCorridors ? "wc" : "")}", mapDescription, new DungeonGeneratorConfiguration <int>() { EarlyStopIfIterationsExceeded = 20000, // Chains = chainDecomposition.GetChains(mapDescription.GetGraph()), SimulatedAnnealingConfiguration = new SimulatedAnnealingConfigurationProvider(new SimulatedAnnealingConfiguration() { MaxIterationsWithoutSuccess = 150 }) }, null)); } } var benchmarkRunner = new BenchmarkRunner <IMapDescription <int> >(); var benchmarkScenario = new BenchmarkScenario <IMapDescription <int> >("RandomGraphs", input => { var layoutDrawer = new SVGLayoutDrawer <int>(); var dungeonGeneratorInput = (DungeonGeneratorInput <int>)input; var layoutGenerator = new DungeonGenerator <int>(input.MapDescription, dungeonGeneratorInput.Configuration); layoutGenerator.InjectRandomGenerator(new Random(0)); return(new LambdaGeneratorRunner(() => { var simulatedAnnealingArgsContainer = new List <SimulatedAnnealingEventArgs>(); void SimulatedAnnealingEventHandler(object sender, SimulatedAnnealingEventArgs eventArgs) { simulatedAnnealingArgsContainer.Add(eventArgs); } layoutGenerator.OnSimulatedAnnealingEvent += SimulatedAnnealingEventHandler; var layout = layoutGenerator.GenerateLayout(); layoutGenerator.OnSimulatedAnnealingEvent -= SimulatedAnnealingEventHandler; var additionalData = new AdditionalRunData() { SimulatedAnnealingEventArgs = simulatedAnnealingArgsContainer, GeneratedLayoutSvg = layout != null ? layoutDrawer.DrawLayout(layout, 800, forceSquare: true) : null, GeneratedLayout = layout, }; var generatorRun = new GeneratorRun <AdditionalRunData>(layout != null, layoutGenerator.TimeTotal, layoutGenerator.IterationsCount, additionalData); return generatorRun; })); });