예제 #1
0
        /// <summary>
        /// Метод выполняет процесс моделирования
        /// </summary>
        public SimulationResult Simulate(SimulationOptions options)
        {
            foreach (var procedure in options.Procedures.Where(x => !x.Inputs.Any()))
            {
                StartProcedure.Connect(procedure);
            }

            foreach (var procedure in options.Procedures.Where(x => !x.Outputs.Any()))
            {
                procedure.Connect(EndProcedure);
            }

            StartProcedure.Inputs[0].Tokens.Enqueue(options.StartToken);

            var activeProcedures = options.Procedures
                                   .Concat(new[] { StartProcedure, EndProcedure })
                                   .ToList();

            var logs = new List <SimulationLog>();

            double?modelingTime = null;

            for (double time = 0; time < options.MaxTime; time += options.SimulationStep)
            {
                var finishedProcedures = activeProcedures
                                         .Select(x => new { Procedure = x, Result = x.Update(time) })
                                         .Where(x => x.Result != null)
                                         .ToList();

                logs.AddRange(finishedProcedures.Select(
                                  x => new SimulationLog {
                    Procedure = x.Procedure, SimulationResult = x.Result
                })
                              );

                if (EndProcedure.Outputs[0].Tokens.Any())
                {
                    modelingTime = time;
                    break;
                }
            }

            foreach (var procedure in activeProcedures)
            {
                procedure.Flush();
            }

            return(new SimulationResult
            {
                ModelingTime = modelingTime,
                TotalPrice = activeProcedures.Sum(p => p.AllResources.Sum(r => r.Cost)),
                //TotalPrice = activeProcedures
                //    .SelectMany(x => x.AllResources
                //        .SelectMany(res => res.Parameters)
                //        .Where(param => param.Key == "Стоимость")
                //        .Select(param => param.Value))
                //    .Sum(),
                Logs = logs
            });
        }
예제 #2
0
        void Simulate()
        {
            var isFinished = false;

            while (!isFinished)
            {
                StartProcedure.UpdateState(CurrentTime, Step);

                isFinished = SimProcedures.All(x => x.Status == ProcedureStatus.Finished);

                if (!isFinished)
                {
                    CurrentTime += Step;
                }
            }
        }