/// <summary> /// Поиск свободного оборудования в списке; (возвращаем true, если находим свободное оборудование, false - иначе); /// Доп. выходные параметры: /// operationtime - время окончания операции (для первого случая) или ближайшее время начала операции (для второго случая); /// </summary> public bool IsFree(DateTime T, IOperation o, out DateTime operationtime, out SingleEquipment equip) { TimeSpan t = o.GetDuration(); int intervalindex; foreach (SingleEquipment e in o.GetEquipment()) { if ((e.IsNotOccupied(T)) && (e.GetCalendar().IsInterval(T, out intervalindex))) { equip = e; operationtime = e.GetCalendar().GetTimeofRelease(T, t, intervalindex); return(true); } } equip = null; DateTime mintime = DateTime.MaxValue; foreach (SingleEquipment e in o.GetEquipment()) { if (e.GetCalendar().GetNearestStart(T) <= mintime) { mintime = e.GetCalendar().GetNearestStart(T); } } operationtime = mintime; return(false); }
private Operation op; //операция, для которой созданно данное решение public Decision(DateTime start_time_, DateTime end_time_, SingleEquipment equipment_id_, Operation op_) { start_time = start_time_; end_time = end_time_; equipment_id = equipment_id_; op = op_; }
public Dictionary <int, IEquipment> ReadSystemData() //чтение данных по расписанию и станкам { List <Interval> intlist = new List <Interval>(); List <Interval> doneintlist = new List <Interval>(); eqdic = new Dictionary <int, IEquipment>(); DateTime start = new DateTime(); DateTime end = new DateTime(); XElement root = sdata.Root; df = sdata.Root.Name.Namespace; foreach (XElement elm in root.Descendants(df + "CalendarInformation")) { if (elm.Attribute("date_begin") != null) { string date = elm.Attribute("date_begin").Value; DateTime.TryParseExact(date, datapattern, null, DateTimeStyles.None, out start); } if (elm.Attribute("date_end") != null) { string date = elm.Attribute("date_end").Value; DateTime.TryParseExact(date, datapattern, null, DateTimeStyles.None, out end); } foreach (XElement eg in elm.Elements(df + "EquipmentGroup")) { foreach (XElement inc in eg.Elements(df + "Include")) { DateTime tmpdata = start; while (tmpdata != end) { if ((int)tmpdata.DayOfWeek == int.Parse(inc.Attribute("day_of_week").Value)) { int ind = inc.Attribute("time_period").Value.IndexOf("-"); int sh = int.Parse(inc.Attribute("time_period").Value.Substring(0, 1)); int eh = int.Parse(inc.Attribute("time_period").Value.Substring(ind + 1, 2)); intlist.Add(new Interval(new DateTime(tmpdata.Year, tmpdata.Month, tmpdata.Day, sh, 0, 0), new DateTime(tmpdata.Year, tmpdata.Month, tmpdata.Day, eh, 0, 0))); } tmpdata = tmpdata.AddDays(1); } } foreach (XElement exc in eg.Elements(df + "Exclude")) { foreach (Interval t in intlist) { if ((int)t.GetStartTime().DayOfWeek == int.Parse(exc.Attribute("day_of_week").Value)) { int ind = exc.Attribute("time_period").Value.IndexOf("-"); int sh = int.Parse(exc.Attribute("time_period").Value.Substring(0, 2)); int eh = int.Parse(exc.Attribute("time_period").Value.Substring(ind + 1, 2)); DateTime dt = t.GetStartTime().AddHours(-t.GetStartTime().Hour); Interval tmpint; doneintlist.Add(SeparateInterval(t, dt.AddHours(sh), dt.AddHours(eh), out tmpint)); doneintlist.Add(tmpint); } } } } } Calendar calendar = new Calendar(doneintlist); foreach (XElement elm in root.Descendants(df + "EquipmentInformation").Elements(df + "EquipmentGroup")) { GroupEquipment tmp = new GroupEquipment(calendar, int.Parse(elm.Attribute("id").Value), elm.Attribute("name").Value); foreach (XElement eg in elm.Elements(df + "EquipmentGroup")) { GroupEquipment gtmp = new GroupEquipment(calendar, int.Parse(eg.Attribute("id").Value), eg.Attribute("name").Value); foreach (XElement eq in eg.Elements(df + "Equipment")) { SingleEquipment stmp = new SingleEquipment(calendar, int.Parse(eq.Attribute("id").Value), eq.Attribute("name").Value); eqdic.Add(stmp.GetID(), stmp); gtmp.AddEquipment(stmp); } tmp.AddEquipment(gtmp); eqdic.Add(gtmp.GetID(), gtmp); } eqdic.Add(tmp.GetID(), tmp); } return(eqdic); }
/// <summary> /// поставить операцию в расписание и создать решение /// </summary> public void SetOperationInPlan(DateTime real_start_time, DateTime real_end_time, SingleEquipment real_equipment_id) { enable = true; decision = new Decision(real_start_time, real_end_time, real_equipment_id, this); }