コード例 #1
0
ファイル: Simulation.cs プロジェクト: SmallBossGames/RGZ_IM
        public static Statistic Simulate(double fullTime, SimulationUtility utility)
        {
            var flow      = new FlowAlterantive(15);
            var queue     = new InputQueue();
            var wave      = new Wave();
            var statistic = new Statistic();

            flow.Init(wave, queue, statistic, utility);
            queue.Init(wave, flow, utility, statistic);
            wave.Init(flow, utility);

            var timeScale = 0.0;

            IQuest[] quests = { flow, queue, wave };

            while (timeScale < fullTime)
            {
                Array.Sort(quests);
                for (int i = 0; i < quests.Length; i++)
                {
                    if (quests[i].EndTime > timeScale)
                    {
                        timeScale = quests[i].EndTime;
                    }

                    if (quests[i].TryMake(timeScale))
                    {
                        break;
                    }
                }
            }
            return(statistic);
        }
コード例 #2
0
ファイル: Form1.cs プロジェクト: SmallBossGames/RGZ_IM
        double WriteData(SimulationUtility utility)
        {
            const int itCount = 50;

            double accuracy          = Convert.ToDouble(AccuracyTextBox.Text);
            double kvantil           = Convert.ToDouble(KvantilTextBox.Text);
            double middleInQueueTime = 0;
            double dispersion        = 0;
            double itCountFinal      = 0;

            double[] middleInQueueTimeS = new double[itCount];

            for (int i = 0; i < itCount; i++)
            {
                var statistic = Simulation.Simulate(Convert.ToDouble(FullTimeTextBox.Text), utility);
                var middle    = statistic.MiddleInQueueTime;
                middleInQueueTimeS[i] = middle;
                middleInQueueTime    += middle / itCount;
            }

            for (int i = 0; i < itCount; i++)
            {
                dispersion += (middleInQueueTimeS[i] * middleInQueueTimeS[i] - middleInQueueTime * middleInQueueTime);
            }

            dispersion /= itCount - 1;

            itCountFinal = Math.Ceiling(dispersion * dispersion * kvantil * kvantil / (accuracy * accuracy));

            return(itCountFinal);
        }
コード例 #3
0
ファイル: Flow.cs プロジェクト: SmallBossGames/RGZ_IM
 public void Init(Wave wave, InputQueue inputQueue, Statistic statistic, SimulationUtility utility)
 {
     this.statistic  = statistic;
     this.wave       = wave;
     this.inputQueue = inputQueue;
     this.utility    = utility;
 }
コード例 #4
0
 public void Init(Wave wave, FlowAlterantive flow, SimulationUtility utility, Statistic statistic)
 {
     this.utility   = utility;
     this.wave      = wave;
     this.flow      = flow;
     this.statistic = statistic;
     EndTime        = utility.GetNextPeopleTime(false);
 }
コード例 #5
0
ファイル: Flow.cs プロジェクト: SmallBossGames/RGZ_IM
 public void Init(Wave wave, InputQueue inputQueue, Statistic statistic, SimulationUtility utility)
 {
     this.statistic  = statistic;
     this.wave       = wave;
     this.inputQueue = inputQueue;
     this.utility    = utility;
     channelList     = new ChannelList(utility.ExtremalChannelCount);
     statistic.Flows = channelList.GetChannels;
 }
コード例 #6
0
ファイル: Form1.cs プロジェクト: SmallBossGames/RGZ_IM
        private void button1_Click(object sender, EventArgs e)
        {
            double itCount = 0;
            var    utility = new SimulationUtility(Convert.ToDouble(NextPeopleTimeTextBox.Text), Convert.ToDouble(NextPeopleTimeTextBox.Text) / 2, Convert.ToDouble(NextWaveTimeTextBox.Text), Convert.ToDouble(WaveTimeTextBox.Text), Convert.ToDouble(MiddleServiceTimeTextBox.Text), Convert.ToDouble(MiddleServiceWaveTimeTextBox.Text), Convert.ToDouble(OrderTimeTextBox.Text));

            utility.DefaultChannelCount  = Convert.ToInt32(ChannelCountTextBox.Text);
            utility.WaveChannelCount     = Convert.ToInt32(channelCountWaveTextBox.Text);
            utility.ExtremalChannelCount = Convert.ToInt32(channelExtremeTextBox.Text);
            int    peopleCount        = 0;
            double fullPeopleCount    = 0;
            double MiddleInQueue      = 0;
            double MiddleInPhase1Time = 0;
            double MiddleInPhase2Time = 0;
            double intervals          = 0;
            var    table      = new Table();
            double InWorkTime = 0;

            itCount = WriteData(utility);

            for (int i = 0; i < itCount; i++)
            {
                var statistic = Simulation.Simulate(Convert.ToDouble(FullTimeTextBox.Text), utility);
                fullPeopleCount    += statistic.FullPeopleCount;
                peopleCount        += statistic.PeopleCount;
                MiddleInQueue      += statistic.MiddleInQueueTime;
                MiddleInPhase1Time += statistic.MiddlePhase1Time;
                MiddleInPhase2Time += statistic.MiddlePhase2Time;
                intervals          += statistic.IntervalCount;

                int j = 1;

                if (i == 0)
                {
                    foreach (var a in statistic.Flows)
                    {
                        table.AddData(j, a.InWorkTime, a.ActiveTime, (a.InWorkTime / Convert.ToDouble(FullTimeTextBox.Text)));
                        InWorkTime += a.InWorkTime;
                        j++;
                    }
                }
            }

            table.Show();
            IterationCountTextBox.Text         = itCount.ToString();
            PeopleCountTextBox.Text            = Math.Round((peopleCount / itCount), 2).ToString();
            MiddleTimeInQueveTextBox.Text      = Math.Round((MiddleInQueue / itCount), 2).ToString();
            MiddleTimeInPhase1TextBox.Text     = Math.Round((MiddleInPhase1Time / itCount), 2).ToString();
            MiddleTimeInPhase2TextBox.Text     = Math.Round((MiddleInPhase2Time / itCount), 2).ToString();
            ChannelsMiddleTimeWorkTextBox.Text = Math.Round((InWorkTime / itCount), 2).ToString();
            MiddleRequestTextBox.Text          = Math.Round((itCount * Convert.ToDouble(FullTimeTextBox.Text)) / intervals, 2).ToString();
        }