Example #1
0
        // Вычисление сроков наступления всех вершин графа
        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();
                    }
                }
            }
        }
Example #2
0
        // Вычисление сроков окончания всех вершин графа
        public void CalcAllDotLC()
        {
            OperationLogger.AddMessage("\n\nВычисление сроков окончания");

            // Вычисления проводятся пока не будет найден срок окончания истока
            while (Source.LC == null)
            {
                foreach (Dot dot in Dots)
                {
                    if (dot.LC == null)
                    {
                        dot.CalcLC();
                    }
                }
            }
        }
Example #3
0
        // Кнопка вычисления
        private void BCalculate_Click(object sender, EventArgs e)
        {
            OperationLogger.Clear();

            // Создался ли граф
            if (!TryCreateANewGraph())
            {
                return;
            }

            // Очистка полей вывода
            DGES.Rows.Clear();
            DGLines.Rows.Clear();

            // Подсчёт значений
            try{
                AGraph.CalcAllDotES();
                AGraph.CalcAllDotLC();
                AGraph.CalcAllLineTF();
                AGraph.CalcAllLineFF();
            } catch (Exception ex) {
                MessageBox.Show(ex.Message);
                return;
            }

            // Вывод информации о точках
            foreach (Dot dot in AGraph.Dots)
            {
                DataGridViewRow NewRow = DGES.Rows[DGES.Rows.Add()];

                NewRow.Cells["Dot"].Value = dot.Name;
                NewRow.Cells["ES"].Value  = dot.ES.ToString();
                NewRow.Cells["LC"].Value  = dot.LC.ToString();
            }

            // Вывод информации о дугах
            foreach (Line line in AGraph.Lines)
            {
                DataGridViewRow NewRow = DGLines.Rows[DGLines.Rows.Add()];

                NewRow.Cells["Cij"].Value = line.StartDot.Name + "-" + line.EndDot.Name;
                NewRow.Cells["ESi"].Value = line.StartDot.ES;
                NewRow.Cells["LCj"].Value = line.EndDot.LC;
                NewRow.Cells["TF"].Value  = line.TF.ToString();
                NewRow.Cells["FF"].Value  = line.FF.ToString();
            }
        }
Example #4
0
        // Вычисление срока наступления
        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());
            }
        }
Example #5
0
        // Вычисление срока окончания
        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());
            }
        }