public void ClearEvents() { //Формирование всех дат и доступных нарядов в них var dates = ПериодГрафика.Select(date => new ДатаГрафика { Date = date, Смены = Наряды.Where(nar => !nar.Усиление || Усиления.Contains(date)) .Where(nar => nar.Дни == WeekDays.Все || (nar.Дни == WeekDays.Выходные && Праздники.Contains(date)) || (nar.Дни == WeekDays.Будние && !Праздники.Contains(date))) .ToDictionary <Наряд, Наряд, Подразделение>(nar => nar, nar => null) }).ToList(); //Заполнение заблокированных нарядов foreach (var date in dates) { var find = ДатыГрафика.FirstOrDefault(gr => gr.Date == date.Date); if (find == null) { continue; } foreach (var nar in find.Блокировки) { date.Блокировки.Add(nar); if (!find.Смены.ContainsKey(nar)) { continue; } if (nar.Усиление && !Усиления.Contains(date.Date)) { continue; } if (Подразделения.Contains(find.Смены[nar])) { date.Смены[nar] = find.Смены[nar]; } } } //Перезапись старого графика новым //ДатыГрафика = new ObservableCollection<ДатаГрафика>(dates); ДатыГрафика.Clear(); foreach (var date in dates) { ДатыГрафика.Add(date); } ПересчитатьПодразделения(); }
public void GenerateEvents() { List <ДатаГрафика> best = null; double bestres = 0; for (int i = 0; i < 1000; i++) { ClearEvents(); var rand = new Random(); //Формирование конкретных нарядов на выходные var holypairs = new List <KeyValuePair <ДатаГрафика, Наряд> >(); foreach (var day in ДатыГрафика) { var day1 = day; foreach (var smen in day.Смены .Where(pair => !day1.Блокировки.Contains(pair.Key) && pair.Value == null && day1.Holyday) .Select(pair => pair.Key)) { holypairs.Insert(rand.Next(holypairs.Count), (new KeyValuePair <ДатаГрафика, Наряд>(day, smen))); } } //Сортировка нарядов по длительности в порядке убывания holypairs.Sort((pair, valuePair) => valuePair.Value.Длительность.CompareTo(pair.Value.Длительность)); аспределитьНаряды(holypairs); //Формирование конкретных нарядов var pairs = new List <KeyValuePair <ДатаГрафика, Наряд> >(); foreach (var day in ДатыГрафика) { var day1 = day; foreach (var smen in day.Смены .Where(pair => !day1.Блокировки.Contains(pair.Key) && pair.Value == null) .Select(pair => pair.Key)) { pairs.Insert(rand.Next(pairs.Count), (new KeyValuePair <ДатаГрафика, Наряд>(day, smen))); } } //Сортировка нарядов по длительности в порядке убывания pairs.Sort((pair, valuePair) => valuePair.Value.Длительность.CompareTo(pair.Value.Длительность)); аспределитьНаряды(pairs); //Выборка лучшего случая if (best == null) { best = ДатыГрафика.ToList(); if (Подразделения.Count == 0) { break; } bestres = Math.Abs(Подразделения.Max(dist => dist.ОтклонениеЗагруженности)) + Math.Abs(Подразделения.Min(dist => dist.ОтклонениеЗагруженности)); } else { var res = Math.Abs(Подразделения.Max(dist => dist.ОтклонениеЗагруженности)) + Math.Abs(Подразделения.Min(dist => dist.ОтклонениеЗагруженности)); if (res < bestres) { best.Clear(); best.AddRange(ДатыГрафика); ПересчитатьПодразделения(); bestres = res; } } } //ДатыГрафика = best; ДатыГрафика.Clear(); foreach (var date in best) { ДатыГрафика.Add(date); } аскидать(); }