Esempio n. 1
0
        SimulationHistory GetSimHistory()
        {
            var history = new SimulationHistory
            {
                Duration    = CurrentTime,
                WaitingTime = SimProcedures.Sum(x => x.WaitingTime),
                TotalCost   = SimResources.Sum(x => x.Resource.Price),
                Complexity  = Complexity,
                Step        = Step,
                DateTime    = DateTime.Now,
                Resources   = SimResources.Select(x => new ResourceHistory
                {
                    ResourceName = x.Resource.ResourceName,
                    ResourceId   = x.Resource.ResourceId,
                    Cost         = x.Resource.Price,
                    UseTime      = x.ActiveTime.Sum(t => t.Item2 - t.Item1),
                    Downtime     = CurrentTime - x.ActiveTime.Sum(t => t.Item2 - t.Item1),
                    UseHistory   = x.ActiveTime.Select(t => new ResourceUseHistory
                    {
                        StartTime = t.Item1,
                        EndTime   = t.Item2
                    }).ToList(),
                }).ToList(),
                Procedures = SimProcedures.Select(x => new ProcedureHistory
                {
                    ProcedureName  = x.Procedure.Name,
                    ProcedureAlias = x.Procedure.Alias,
                    StartTime      = x.StartTime,
                    EndTime        = x.EndTime,
                    WaitingTime    = x.WaitingTime,
                    RandomEvents   = x.SimRandomEvents.Where(e => e.IsHappened).Select(e => new RandomEventHistory
                    {
                        EventName  = e.Event.EventName,
                        EventAlias = e.Event.EventAlias,
                        StartTime  = e.TimeStart,
                        EndTime    = e.TimeEnd
                    }).ToList()
                }).ToList()
            };

            return(history);
        }
Esempio n. 2
0
        public void UpdateState(int currentTime, int step)
        {
            switch (Status)
            {
            case ProcedureStatus.NotStarted:
            {
                if (SimResources.All(x => x.Status == ResourceStatus.Free))
                {
                    Status    = ProcedureStatus.Started;
                    StartTime = currentTime;
                    SetResourcesStatus(ResourceStatus.Busy, currentTime);
                    InitRandomEvents();
                }
                else
                {
                    WaitingTime += step;
                }

                break;
            }

            case ProcedureStatus.Started:
            {
                var completionLevel = GetProgressFunctionValue(currentTime - StartTime);
                if (Double.IsNaN(completionLevel))
                {
                    throw new SimulationException($"Не хватает значений параметров процедуры {Procedure.Alias}");
                }
                if (completionLevel >= 1)
                {
                    if (!IsAllRandomEventsCompleted)
                    {
                        IsAllRandomEventsCompleted = CheckRandomEventsStatus();
                    }

                    if (!IsAllRandomEventsCompleted)
                    {
                        UpdateEventsState(currentTime);
                        IsAllRandomEventsCompleted = CheckRandomEventsStatus();
                    }

                    if (IsAllRandomEventsCompleted)
                    {
                        Status  = ProcedureStatus.Finished;
                        EndTime = currentTime;
                        SetResourcesStatus(ResourceStatus.Free, currentTime);
                        foreach (var procedure in NextProcedures)
                        {
                            procedure.UpdateState(currentTime, step);
                        }
                    }
                }

                break;
            }

            case ProcedureStatus.Finished:
            {
                foreach (var procedure in NextProcedures)
                {
                    procedure.UpdateState(currentTime, step);
                }

                break;
            }
            }
        }