/// <summary> /// Rekursive Überprüfung auf Zyklen indem der überprüft wird ob der Index eines beliebigen Nachfolgers bereits besucht wurde. /// Andernfalls wird der Nachfolger einem Klon der Liste hinzugefügt und mit diesem weitergerechnet. /// </summary> /// <param name="v">Aktuell zu überprüfendes Vorgang-Objekt.</param> /// <param name="list">Liste der bereits überprüften Vorgänge.</param> /// <returns>true falls ein Zyklus vorliegt, false falls nicht.</returns> private Boolean HasZyklus(Vorgang v, List <int> list) { foreach (var n in v.Nachfolger(Repo)) { if (list.IndexOf(n.Id) > -1) { return(true); } var temp = new List <int>(list); temp.Add(n.Id); return(HasZyklus(n, temp)); } return(false); }
/// <summary> /// Weist dem Vorgang SEZ = FEZ zu falls dieser ein Endvorgang ist. Andernfalls wird die kleinste späteste Anfangszeit aller Nachfolger für diesen Wert verwendet. /// Setzt die früheste Endzeit aus der Dauer und der frühesten Anfangszeit zusammen. /// </summary> /// <param name="v">Zu verarbeitender Vorgang.</param> private void KalkRueckwaerts(Vorgang v) { if (v.isEnd) { v.SEZ = v.FEZ; } else { v.SEZ = v.Nachfolger(Repo).OrderBy(o => o.SAZ).ToList().First().SAZ; } v.SAZ = v.SEZ - v.Dauer; foreach (var vo in v.Vorgaenger(Repo)) { KalkRueckwaerts(vo); } }
/// <summary> /// Weist dem Vorgang FAZ = 0 zu falls dieser ein Startvorgang ist. Andernfalls wird die größte früheste Endzeit aller Vorgänger für diesen Wert verwendet. /// Setzt die früheste Endzeit aus der Dauer und der frühesten Anfangszeit zusammen. /// </summary> /// <param name="v">Zu verarbeitender Vorgang.</param> private void KalkVorwaerts(Vorgang v) { if (v.isStart) { v.FAZ = 0; } else { v.FAZ = v.Vorgaenger(Repo).OrderByDescending(o => o.FEZ).ToList().First().FEZ; } v.FEZ = v.FAZ + v.Dauer; foreach (var n in v.Nachfolger(Repo)) { KalkVorwaerts(n); } }