// Вычисление сроков наступления всех вершин графа public void CalcAllDotES() { if (Source == null) { if (FindSource() == null) { throw new Exception("Граф не имеет источника"); } } if (Drain == null) { if (FindDrain() == null) { throw new Exception("Граф не имеет стока"); } } OperationLogger.AddMessage("Вычисление сроков наступления"); // Вычисления проводятся пока не будет найден срок наступления стока while (Drain.ES == null) { foreach (Dot dot in Dots) { if (dot.ES == null) { dot.CalcES(); } } } }
// Вычисление сроков окончания всех вершин графа public void CalcAllDotLC() { OperationLogger.AddMessage("\n\nВычисление сроков окончания"); // Вычисления проводятся пока не будет найден срок окончания истока while (Source.LC == null) { foreach (Dot dot in Dots) { if (dot.LC == null) { dot.CalcLC(); } } } }
// Вычисление срока наступления public void CalcES() { // Если не источник if (IsEndOf.Count != 0) { if (CanCalculateES()) { OperationLogger.AddMessage("ES" + Name + " = "); // Вычисление первого значения int Max = (int)IsEndOf[0].StartDot.ES + IsEndOf[0].Duration; // Временные переменные используемые для составления описания (логов) вычислений string FirstElemOperationLog = ((int)IsEndOf[0].StartDot.ES).ToString() + " + " + IsEndOf[0].Duration.ToString(); string CalcLog = ""; if (IsEndOf.Count > 1) { OperationLogger.AppendToLastMessage("max{"); } OperationLogger.AppendToLastMessage("ES" + IsEndOf[0].StartDot.Name + " + C" + IsEndOf[0].StartDot.Name + Name); for (int i = 1; i < IsEndOf.Count; i++) { // Вычисление возможного значения int temp = (int)IsEndOf[i].StartDot.ES + IsEndOf[i].Duration; // Формирование сообщения OperationLogger.AppendToLastMessage("; ES" + IsEndOf[i].StartDot.Name + " + C" + IsEndOf[i].StartDot.Name + Name); CalcLog += "; " + ((int)IsEndOf[i].StartDot.ES).ToString() + " + " + IsEndOf[i].Duration.ToString(); // Выбор максимума if (Max < temp) { Max = temp; } } // Запись значения ES = Max; // Окончание сообщения if (IsEndOf.Count > 1) { OperationLogger.AppendToLastMessage("} = max{" + FirstElemOperationLog + CalcLog + "}"); } OperationLogger.AppendToLastMessage(" = " + ES.ToString()); } // Если источник, ES = 0 } else { ES = 0; OperationLogger.AddMessage("ES" + Name + " = "); OperationLogger.AppendToLastMessage(ES.ToString()); } }
// Вычисление срока окончания public void CalcLC() { // Если не сток if (IsStartOf.Count != 0) { if (CanCalculateLC()) { OperationLogger.AddMessage("LC" + Name + " = "); // Вычисление первого значения int Min = (int)IsStartOf[0].EndDot.LC - IsStartOf[0].Duration; // Временные переменные для составления описания (логов) вычислений string FirstElemOperationLog = ((int)IsStartOf[0].EndDot.LC).ToString() + " - " + IsStartOf[0].Duration; string CalcLog = ""; if (IsStartOf.Count > 1) { OperationLogger.AppendToLastMessage("min{"); } OperationLogger.AppendToLastMessage("LC" + IsStartOf[0].EndDot.Name + " - C" + Name + IsStartOf[0].EndDot.Name); for (int i = 1; i < IsStartOf.Count; i++) { // Вычисление возможного значения int temp = (int)IsStartOf[i].EndDot.LC - IsStartOf[i].Duration; // Формирование сообщения OperationLogger.AppendToLastMessage("; LC" + IsStartOf[i].EndDot.Name + " - C" + Name + IsStartOf[i].EndDot.Name); CalcLog += "; " + ((int)IsStartOf[i].EndDot.LC).ToString() + " - " + IsStartOf[i].Duration.ToString(); // Выбор минимума if (Min > temp) { Min = temp; } } // Запись значения LC = Min; // Окончание сообщения if (IsStartOf.Count > 1) { OperationLogger.AppendToLastMessage("} = min{" + FirstElemOperationLog + CalcLog + "}"); } OperationLogger.AppendToLastMessage(" = " + LC.ToString()); } // Если сток, присваиваем значение ES } else { if (ES != null) { LC = ES; } else { throw new Exception("Сток имеет не вычисленный срок наступления"); } OperationLogger.AddMessage("LC" + Name + " = ES" + Name + " = " + LC.ToString()); } }