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()); }
public virtual ISimulationResult Simulate() { SimpleSimulationResult simulationResult = new SimpleSimulationResult(); CheckInitializationAndInputData(simulationResult); if (simulationResult.HasErrors) { return(simulationResult); } //создадим свою модель, специально заточенную под этот алгоритм Model model = CreateModel(); RunSimulation(model); return(model.ToSimulationResult()); }
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); }