Example #1
0
        /// <summary>
        /// This implements the MiniMax algorithm.
        /// </summary>
        /// <returns></returns>
        private Tuple <double, IntelligentRoundabout> GetBestNextOption()
        {
            var allCars = GetAllCarsOnRoundabout();

            if (allCars.Count == 0)
            {
                return(Tuple.Create(0.0, GetPossibleSolutionsForNextIter(this).First()));
            }

            var sols       = GetPossibleSolutionsForNextIter(this);
            var bestMetric = double.MaxValue;
            IntelligentRoundabout bestSol = null;

            foreach (var sol in sols)
            {
                var copy = sol.CloneToConv();
                while (copy.GetAllCarsOnRoundabout().Count != 0)
                {
                    copy.IterateWithoutNewCars();
                }

                var thisSolVal = copy.GetAvgWaitTimeForFinished();
                if (thisSolVal < bestMetric)
                {
                    bestMetric = thisSolVal;
                    bestSol    = sol;
                }
            }
            if (bestSol == null)
            {
                throw new Exception("Did not find any solution better than infinity??");
            }
            return(Tuple.Create(bestMetric, bestSol));
        }
Example #2
0
        private void RunSampleButton_Click(object sender, EventArgs e)
        {
            string resString = $"Results: {Environment.NewLine}";
            var cpmMin = Convert.ToInt32(MinCpmSelector.Value);
            var cpmMax = Convert.ToInt32(MaxCpmSelector.Value);
            IntelligentRoundabout intelligent = null;
            ConventionalRoundabout conventional = null;

            for (int i = 0; i < Convert.ToInt32(NumOfRunsSelector.Value); i++)
            {
                List<TrafficPattern> patterns = new List<TrafficPattern>();
                Roundabout.SimulationDuration = Tools.GetRandomIntInRange(Convert.ToInt32(MinDurationSelector.Value),Convert.ToInt32(MaxDurationSelector.Value));
                var cpmN = Tools.GetRandomIntInRange(cpmMin, cpmMax);
                var cpmW = Tools.GetRandomIntInRange(cpmMin, cpmMax);
                var cpmS = Tools.GetRandomIntInRange(cpmMin, cpmMax);
                var cpmE = Tools.GetRandomIntInRange(cpmMin, cpmMax);

                var dN = Tools.GetRandomDestinations();
                var dW = Tools.GetRandomDestinations();
                var dS = Tools.GetRandomDestinations();
                var dE = Tools.GetRandomDestinations();

                patterns.Add(new TrafficPattern(EntryPosition.North, cpmN, dN.Item1,
                    dN.Item2, dN.Item3, dN.Item4));
                patterns.Add(new TrafficPattern(EntryPosition.West, cpmW, dW.Item1,
                    dW.Item2, dW.Item3, dW.Item4));
                patterns.Add(new TrafficPattern(EntryPosition.South, cpmS, dS.Item1,
                    dS.Item2, dS.Item3, dS.Item4));
                patterns.Add(new TrafficPattern(EntryPosition.East, cpmE, dE.Item1,
                    dE.Item2, dE.Item3, dE.Item4));
                resString += $"ROUNDABOUT {i}, duration: {Roundabout.SimulationDuration} sec: {Environment.NewLine}";
                resString +=
                    $"N EntryLane: cpm: {cpmN} toN: {dN.Item1}, toW: {dN.Item2}, toS: {dN.Item3}, toE: {dN.Item4} {Environment.NewLine}";
                resString +=
                    $"W EntryLane: cpm: {cpmW} toN: {dW.Item1}, toW: {dW.Item2}, toS: {dW.Item3}, toE: {dW.Item4} {Environment.NewLine}";
                resString +=
                    $"S EntryLane: cpm: {cpmS} toN: {dS.Item1}, toW: {dS.Item2}, toS: {dS.Item3}, toE: {dS.Item4} {Environment.NewLine}";
                resString +=
                    $"E EntryLane: cpm: {cpmE} toN: {dE.Item1}, toW: {dE.Item2}, toS: {dE.Item3}, toE: {dE.Item4} {Environment.NewLine}";

                intelligent = new IntelligentRoundabout();
                intelligent.Init(patterns);
                while (!intelligent.SimulationFinished)
                {
                    intelligent = intelligent.GetBestNextOptionMain();
                }
                resString += $"Intelligent Roundabout results: avg time: {Math.Round(intelligent.GetAvgWaitTimeForFinished(),3)}, max: {intelligent.GetMaxWaitTime()}, dur: {intelligent.OwnCurrTime}{Environment.NewLine}";

                conventional = new ConventionalRoundabout();
                conventional.Init(patterns);
                while (!conventional.SimulationFinished)
                {
                    conventional.IterateSimaultion();
                }
                resString += $"Conventional Roundabout results: avg time: {Math.Round(conventional.GetAvgWaitTimeForFinished(),3)}, max: {conventional.GetMaxWaitTime()}, dur: {conventional.OwnCurrTime}{Environment.NewLine}";
                resString += $"{Environment.NewLine}{Environment.NewLine}";

            }
            var res = FlexibleMessageBox.Show(resString, "Finished. OK to save to file, Cancel to dismiss", MessageBoxButtons.OKCancel);
            if (res == DialogResult.OK)
            {
                SaveFileDialog saveFileDialog = new SaveFileDialog();
                saveFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
                saveFileDialog.FilterIndex = 1;

                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    var ms = saveFileDialog.OpenFile();
                    Debug.WriteLine((ms as FileStream).Name);
                    StreamWriter sw = new StreamWriter(ms, new UnicodeEncoding());
                    try
                    {
                        sw.Write(resString);
                        sw.Flush(); //otherwise you are risking empty stream
                        ms.Seek(0, SeekOrigin.Begin);

                        // Test and work with the stream here.
                        // If you need to start back at the beginning, be sure to Seek again.
                    }
                    finally
                    {
                        sw.Dispose();
                        MessageBox.Show($"Saved to: {(ms as FileStream)?.Name}");
                    }
                }
            }
        }