예제 #1
0
        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);
            }
            ПересчитатьПодразделения();
        }
예제 #2
0
        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);
            }
            аскидать();
        }