public override ISimulationResult Simulate()
        {
            SimpleSimulationResult notOptimized = (SimpleSimulationResult)base.Simulate();

            if (notOptimized.HasErrors)
            {
                //нечего тут оптимизировать, одни ошибки
                return(notOptimized);
            }
            //получаем модель по состоянию на завершение моделирования предыдущим методом
            Model  model       = notOptimized.Model;
            double initialCost = model.GetTotalTime();

            bool optimizationStageOk = OptimizeByGain(model);

            if (!optimizationStageOk)
            {
                //состояние модели  поменялось, вторую стадию не запускаем
                //todo: выполнить model.Reset(), провести повторную симуляцию
                //базовым алгоритмом и тогда можно даже в этом случае запустить вторую стадию
                logger.LogWarning("Optimization stage1 failed, returning non-optimized result");
                return(notOptimized);
            }
            //пытаемся перенести задачи с самого загруженного оборудования на простаивающее
            //так, чтобы общее время уменьшилось
            OptimizeByIdleTime(model);
            logger.LogInformation(string.Format("Total optimization benefit after 2 stages : {0}",
                                                initialCost - model.GetTotalTime()));

            return(model.ToSimulationResult());
        }
Exemplo n.º 2
0
        public virtual ISimulationResult Simulate()
        {
            SimpleSimulationResult simulationResult = new SimpleSimulationResult();

            CheckInitializationAndInputData(simulationResult);
            if (simulationResult.HasErrors)
            {
                return(simulationResult);
            }
            //создадим свою модель, специально заточенную под этот алгоритм
            Model model = CreateModel();

            RunSimulation(model);
            return(model.ToSimulationResult());
        }
Exemplo n.º 3
0
        internal static SimpleSimulationResult ToSimulationResult(this Model model)
        {
            SimpleSimulationResult simulationResult = new SimpleSimulationResult();

            simulationResult.Model = model;
            simulationResult.Footnotes.Add(string.Format("Использован алгоритм {0}", model.AlgorithmName));

            simulationResult.Metrics.Add("общее время", model.GetTotalTime().ToString());
            simulationResult.TaskByEquipment.Clear();
            Dictionary <string, string> idleTimes = new Dictionary <string, string>();

            //заполним табличку по загрузке оборудования,
            //попутно посчитаем время простоя
            double totalIdleTime = 0;

            foreach (var eq in model.Equipment)
            {
                idleTimes.Add(eq.name, eq.idleTime.ToString());
                totalIdleTime += eq.idleTime;
                List <IAssignedTask> tasks = new List <IAssignedTask>();
                simulationResult.TaskByEquipment.Add(eq, tasks);
                double time = 0;
                //добавим в результат все задачи, назначенные этому оборудованию
                foreach (var task in eq.AssignedTasks)
                {
                    tasks.Add(new AssignedTask()
                    {
                        id          = task.id,
                        description = task.description,
                        startedAt   = time,
                        duration    = task.Timing[eq]
                    });
                    time += task.Timing[eq];
                }
            }

            //добавим метрики по времени простоя
            simulationResult.Metrics.Add("всего время простоя", totalIdleTime.ToString());
            foreach (var pair in idleTimes)
            {
                simulationResult.Metrics.Add(pair.Key, pair.Value);
            }
            return(simulationResult);
        }