示例#1
0
        private async void SimulateButton_Click(object sender, EventArgs e)
        {
            if (!running)
            {
                running = true;
            }
            else
            {
                return;
            }

            if (!Int32.TryParse(RunCount.Text, out Int32 runCount))
            {
                return;
            }

            if (_workManager == null)
            {
                _workManager = new WorkManager(SimulationParameters.Default);
            }

            List <IAiFactory> selectedAis            = _aiFactories.Where(t => AiList.SelectedItems.ContainsKey(t.Name)).ToList();
            ILevelGenerator   selectedLevelGenerator = _levelGenerators[LevelGeneratorName.Text];

            var progress = new Progress <Int32>(UpdateProgress);

            _completedCount = 0;
            _stopwatch.Reset();
            UpdateStatus();

            Timer.Start();
            _stopwatch.Start();
            (var results, var worstSim, var worstAi) = await _workManager.Simulate(selectedAis, selectedLevelGenerator, runCount, progress);

            _stopwatch.Stop();
            Timer.Stop();

            UpdateStatus();

            _renderSim       = worstSim;
            _renderAiFactory = worstAi;
            if (_renderSim != null && _renderSim.HasError)
            {
                MessageBox.Show("ERROR");
            }

            foreach (var aiFactory in results.Keys)
            {
                var stat = results[aiFactory];
                if (Results.Rows.Count == 0)
                {
                    DataGridViewRow row = new DataGridViewRow();
                    Results.Rows.Add(row);
                }

                (var meanMoves, var meanPower, var meanSamples, var sampleStdDev) = stat;
                Results.Rows[0].SetValues(aiFactory.Name, meanMoves.ToString("F2"), meanPower.ToString("F2"), meanSamples.ToString("F2"), sampleStdDev.ToString("F2"));
            }
            running = false;
        }
示例#2
0
        internal async Task <(Dictionary <IAiFactory, (Double meanMoves, Double meanPower, Double meanSamples, Double sampleStdDev)> aggregates, CompletedSimulation worstSim, IAiFactory worstAi)> Simulate(IList <IAiFactory> aiFactories, Int32 runCount)
        {
            var aggregates = new Dictionary <IAiFactory, (Double meanMoves, Double meanPower, Double meanSamples, Double sampleStdDev)>();
            CompletedSimulation worstSim = null;
            IAiFactory          worstAi  = null;
            Int32 levelSeed = Rando.Next(Int32.MinValue, Int32.MaxValue);

            foreach (var aiFactory in aiFactories)
            {
                var levelRand             = new Random(levelSeed);
                var levelGeneratorFactory = new OpenCheckingGeneratorFactory(new DefaultLevelGeneratorFactory(), 6);
                var roverFactory          = new DefaultRoverFactory();
                var simulator             = new Simulator(levelGeneratorFactory, roverFactory, aiFactory);

                using (Completer completer = Completer.Create(Path.Combine(OutputDirectory, $"RoverSim-{aiFactory.Name}.csv")))
                {
                    await simulator.SimulateAsync(runCount, completer.Consume);

                    aggregates[aiFactory] = completer.GetAggregates();
                    worstSim = Completer.ChooseWorst(worstSim, completer.WorstSim);
                    if (worstSim == completer.WorstSim)
                    {
                        worstAi = aiFactory;
                    }
                }
            }

            return(aggregates, worstSim, worstAi);
        }
示例#3
0
        internal async Task <(Dictionary <IAiFactory, (Double meanMoves, Double meanPower, Double meanSamples, Double sampleStdDev)> aggregates, CompletedSimulation worstSim, IAiFactory worstAi)> Simulate(IList <IAiFactory> aiFactories, ILevelGenerator levelGenerator, Int32 runCount, IProgress <Int32> progress)
        {
            var   aggregates             = new Dictionary <IAiFactory, (Double meanMoves, Double meanPower, Double meanSamples, Double sampleStdDev)>();
            Int32 initialLevelSeed       = NextLevelSeed;
            CompletedSimulation worstSim = null;
            IAiFactory          worstAi  = null;

            foreach (var aiFactory in aiFactories)
            {
                var simulator = new Simulator(Parameters, levelGenerator, aiFactory, initialLevelSeed);

                using Completer completer = Completer.Create(Path.Combine(OutputDirectory, $"RoverSim-{aiFactory.Name}.csv"), progress);

                await simulator.SimulateAsync(runCount, completer.Consume);

                NextLevelSeed = simulator.NextLevelSeed;

                aggregates[aiFactory] = completer.GetAggregates();
                worstSim = Completer.ChooseWorst(worstSim, completer.WorstSim);
                if (worstSim == completer.WorstSim)
                {
                    worstAi = aiFactory;
                }
            }

            return(aggregates, worstSim, worstAi);
        }
示例#4
0
 public RenderViewModel(IAiFactory ai, CompletedSimulation simulation)
 {
     Ai         = ai ?? throw new ArgumentNullException(nameof(ai));
     Simulation = simulation ?? throw new ArgumentNullException(nameof(simulation));
     Tiles      = Simulation.OriginalLevel.AsMutable().Terrain;
     RoverX     = Simulation.Parameters.InitialPosition.X;
     RoverY     = Simulation.Parameters.InitialPosition.Y;
 }
示例#5
0
 public RenderForm(CompletedSimulation demoResult, IAiFactory demoAi)
 {
     DemoResult      = demoResult ?? throw new ArgumentNullException(nameof(demoResult));
     DemoAi          = demoAi ?? throw new ArgumentNullException(nameof(demoAi));
     OutputDirectory = Path.Combine(Directory.GetCurrentDirectory(), DemoAi.Name);
     InitializeComponent();
     RenderControl.VisibleState = VisibleState.GenerateBlank(DemoResult.Parameters);
 }
示例#6
0
 public AiTester(Settings settings, IGameVisualizer gameVisualizer, IAiFactory aiFactory,
                 IGameFactory gameFactory)
 {
     this.settings       = settings;
     this.gameVisualizer = gameVisualizer;
     this.aiFactory      = aiFactory;
     this.gameFactory    = gameFactory;
 }
示例#7
0
 public AiTester(Settings settings, IMapGenerator mapGenerator, IGameVisualizer gameVisualizer, IProcessMonitor monitor, IAiFactory aiFactory, IGameFactory gameFactory)
 {
     this.settings       = settings;
     this.mapGenerator   = mapGenerator;
     this.gameVisualizer = gameVisualizer;
     this.monitor        = monitor;
     this.aiFactory      = aiFactory;
     this.gameFactory    = gameFactory;
 }
示例#8
0
        private static void ExportFrames(CompletedSimulation sim, IAiFactory aiFactory, String outputDir)
        {
            const Int32 tileSize = 10;

            IAi          ai    = aiFactory.Create(sim.Parameters);
            Level        level = sim.ProtoLevel.Generate();
            Rover        rover = new Rover(level, sim.Parameters);
            VisibleState state = VisibleState.GenerateBlank(level.BottomRight, rover.Position);

            using var actionEnumerator = ai.Simulate(rover.Accessor).GetEnumerator();

            Int32 maxFrameCount  = sim.Parameters.InitialMovesLeft;
            Int32 filenameDigits = (Int32)Math.Ceiling(Math.Log10(maxFrameCount)) + 1;

            String        fileBase = Path.Combine(outputDir, $"frame-{sim.ProtoLevel.Seed}-");
            DirectoryInfo dir      = new DirectoryInfo(outputDir);

            if (dir.Exists)
            {
                foreach (var file in dir.EnumerateFiles())
                {
                    file.Delete();
                }
            }
            else
            {
                dir.Create();
            }

            Int32 width  = level.Width * tileSize;
            Int32 height = level.Height * tileSize;

            using Bitmap bitmap    = new Bitmap(width, height);
            using Graphics surface = Graphics.FromImage(bitmap);

            Update update     = new Update(terrain: rover.Adjacent);
            Int32  frameIndex = 0;

            do
            {
                if (!state.Apply(update))
                {
                    continue;
                }

                GdiRenderer.Draw(surface, width, height, state);
                String suffix   = frameIndex.ToString().PadLeft(filenameDigits, '0');
                String filename = fileBase + suffix + ".png";
                bitmap.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
                frameIndex++;
            }while (actionEnumerator.MoveNext() && rover.Perform(actionEnumerator.Current, out update));
        }
示例#9
0
        private async void SimulateButton_Click(object sender, EventArgs e)
        {
            if (!running)
            {
                running = true;
            }
            else
            {
                return;
            }

            if (!Int32.TryParse(RunCount.Text, out Int32 runCount))
            {
                return;
            }

            WorkManager manager = new WorkManager();

            List <IAiFactory> selectedAis = aiFactories.Where(t => AiList.SelectedItems.ContainsKey(t.Name)).ToList();

            TimeUsed.Text = "Working...";
            var stopwatch = Stopwatch.StartNew();

            (var results, var worstSim, var worstAi) = await manager.Simulate(selectedAis, runCount);

            stopwatch.Stop();
            TimeUsed.Text = stopwatch.Elapsed.TotalSeconds.ToString();

            _renderSim       = worstSim;
            _renderAiFactory = worstAi;
            if (_renderSim != null && _renderSim.HasError)
            {
                MessageBox.Show("ERROR");
            }

            foreach (var aiFactory in results.Keys)
            {
                var stat = results[aiFactory];
                if (Results.Rows.Count == 0)
                {
                    DataGridViewRow row = new DataGridViewRow();
                    Results.Rows.Add(row);
                }

                (var meanMoves, var meanPower, var meanSamples, var sampleStdDev) = stat;
                Results.Rows[0].SetValues(aiFactory.Name, meanMoves.ToString("F2"), meanPower.ToString("F2"), meanSamples.ToString("F2"), sampleStdDev.ToString("F2"));
            }
            running = false;
        }
示例#10
0
        public RenderViewModel(IAiFactory aiFactory, CompletedSimulation simulation)
        {
            Ai         = aiFactory ?? throw new ArgumentNullException(nameof(aiFactory));
            Simulation = simulation ?? throw new ArgumentNullException(nameof(simulation));

            Start = ReactiveCommand.CreateFromObservable(() =>
            {
                IAi ai      = Ai.Create(Simulation.Parameters);
                Level level = Simulation.ProtoLevel.Generate();
                Rover rover = new Rover(level, Simulation.Parameters);

                return(Observable.Create <(RoverAction action, Update update)>(obs =>
                {
                    return Task.Run(async() =>
                    {
                        var actionEnumerator = ai.Simulate(rover.Accessor).GetEnumerator();
                        while (actionEnumerator.MoveNext() && rover.Perform(actionEnumerator.Current, out Update update))
                        {
                            obs.OnNext((actionEnumerator.Current, update));
                            Int32 delay = actionEnumerator.Current.Instruction switch
                            {
                                Instruction.Move => 75,
                                Instruction.CollectSample => 50,
                                _ => 0
                            };
                            if (delay != 0)
                            {
                                await Task.Delay(delay);
                            }
                        }
                    });
                }));
            });

            Stats = Start.Aggregate(RoverStats.Create(Simulation.Parameters), (s, update) => s.Add(update.action, update.update));

            State = this
                    .WhenAnyObservable(m => m.Start)
                    .Select(update => update.update)
                    .Scan(VisibleState.GenerateBlank(Simulation.Parameters), (state, update) =>
            {
                state.Apply(update);
                return(state);
            });
        }
示例#11
0
 public Simulator(SimulationParameters parameters, ILevelGenerator levelGenerator, IAiFactory aiFactory, Int32 initialLevelSeed)
 {
     Parameters     = parameters ?? throw new ArgumentNullException(nameof(parameters));
     LevelGenerator = levelGenerator ?? throw new ArgumentNullException(nameof(levelGenerator));
     AiFactory      = aiFactory ?? throw new ArgumentNullException(nameof(aiFactory));
     _lastLevelSeed = initialLevelSeed - 1;
 }
示例#12
0
 public AiViewModel(IAiFactory ai)
 {
     Ai = ai ?? throw new ArgumentNullException(nameof(ai));
 }
示例#13
0
 public Simulator(ILevelGeneratorFactory levelGeneratorFactory, IRoverFactory roverFactory, IAiFactory aiFactory)
 {
     LevelGeneratorFactory = levelGeneratorFactory ?? throw new ArgumentNullException(nameof(levelGeneratorFactory));
     RoverFactory          = roverFactory ?? throw new ArgumentNullException(nameof(roverFactory));
     AiFactory             = aiFactory ?? throw new ArgumentNullException(nameof(aiFactory));
 }
示例#14
0
 public RenderForm(CompletedSimulation demoResult, IAiFactory demoAi)
 {
     DemoResult = demoResult ?? throw new ArgumentNullException(nameof(demoResult));
     DemoAi = demoAi ?? throw new ArgumentNullException(nameof(demoAi));
     InitializeComponent();
 }
示例#15
0
 public SimulationRowViewModel(IAiFactory ai, CompletedSimulation simulation)
 {
     Ai         = ai ?? throw new ArgumentNullException(nameof(ai));
     Simulation = simulation ?? throw new ArgumentNullException(nameof(simulation));
 }