Exemplo n.º 1
0
        private void buttonNext_Click(object sender, EventArgs e)
        {
            //для запоминания типа шага
            if (simplextable.ResponseCheck() == 1)
            {
                type_of_step.Add(false);
            }
            else
            {
                type_of_step.Add(true);
            }

            try
            {
                //выбран ли опорный элемент
                simplextable.ButtonPressedOrNot(dataGridView3);
                //смена местами переменной + буферизация
                simplextable.ChangeOfVisualizationVariables(dataGridView3);
                // Буферизируем визуализацию колонок
                simplextable.BufferingVariablevisualizationForDeleteColumns(dataGridView3);
                // Буферизируем визуализацию строк
                simplextable.BufferingVariablevisualizationForDeleteRows(dataGridView3);
                //буферизация элементов таблицы
                simplextable.BufferingSimplexTableValues_ForArtifical();
                //удаляем подсвеченные
                simplextable.delete_green_grids(dataGridView3);
                //вычисление согласно выбранному опорному элементу
                simplextable.CalculateSimplexTable(simplextable.row_of_the_support_element, simplextable.column_of_the_support_element);

                // обновление данных ячеек таблицы
                if (Radical_or_Decimal)
                {
                    addGridParam_for_simplex_elements(simplextable.simplex_elements, dataGridView3);
                }
                else
                {
                    addGridParam_for_simplex_elements(simplextable.simplex_elements_with_radicals, dataGridView3);
                }

                // Если искусственный базис ещё не пришёл в ноль
                if (!ArtificalBasixGoToNull)
                {
                    // создаём новую симплекс таблицу для дальнейшей работы
                    if (Radical_or_Decimal)
                    {
                        simplextable1 = new Simplex(simplextable);
                    }
                    else
                    {
                        simplextable1 = new Simplex(simplextable);
                    }
                }

                if (!ArtificalBasixGoToNull)
                {
                    switch (simplextable1.ArtificialResponseCheck(variable_visualization, dataGridView3))
                    {
                    case 1:

                        step++;

                        if (!ArtificalBasixGoToNull)
                        {
                            // Удаляем столбцы с искусственными переменными.
                            simplextable.DeleteArtificalBasix(dataGridView3);

                            // Считываем ограничения заного
                            if (Radical_or_Decimal)
                            {
                                ogr = new List <List <double> >();
                                read_grids(dataGridView3, ogr);
                                simplextable.simplex_elements = ogr;
                                // удаляем строку с нулями из элементов симплекс таблицы
                                simplextable.simplex_elements.RemoveAt(simplextable.simplex_elements.Count - 1);
                                // удаляем последнюю строку с нулями из датаГрид
                                dataGridView3.Rows.RemoveAt(dataGridView3.Rows.Count - 1);
                                // отображаем новые данные
                                addGridParam_for_simplex_elements(simplextable.simplex_elements, dataGridView3);
                            }

                            else
                            {
                                ogr_with_radicals = new List <List <Fractions> >();
                                read_grids(dataGridView3, ogr_with_radicals);
                                simplextable.simplex_elements_with_radicals = ogr_with_radicals;
                                // удаляем строку с нулями из элементов симплекс таблицы
                                simplextable.simplex_elements_with_radicals.RemoveAt(simplextable.simplex_elements_with_radicals.Count - 1);
                                // удаляем последнюю строку с нулями из датаГрид
                                dataGridView3.Rows.RemoveAt(dataGridView3.Rows.Count - 1);
                                // отображаем новые данные
                                addGridParam_for_simplex_elements(simplextable.simplex_elements_with_radicals, dataGridView3);
                            }

                            // Высчитываем последнюю строку
                            simplextable.CalculateCelRow(dataGridView3);
                        }

                        ArtificalBasixGoToNull = true;

                        switch (simplextable.ResponseCheck())
                        {
                        case 0:
                            //выбор опорного
                            simplextable.SelectionOfTheSupportElement(dataGridView3);
                            label1.Text = "Симплекс таблица";
                            step_1++;
                            break;

                        case 1:
                            // Подставляем ответ
                            if (MinMax == 0)
                            {
                                if (Radical_or_Decimal)
                                {
                                    label_answer.Text = "Ответ :" + simplextable.Response();
                                }
                                else
                                {
                                    label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction();
                                }
                            }
                            else
                            {
                                if (Radical_or_Decimal)
                                {
                                    label_answer.Text = "Ответ: " + simplextable.Response() * (-1);
                                }
                                else
                                {
                                    label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction() * (-1);
                                }
                            }

                            // Выводим точку X*
                            if (corner_dot_was_added == false)
                            {
                                corner_dot_was_added = true;
                                //добавляем точку
                                addGridParam(simplextable.ResponseDot(dataGridView3), dataGridViewCornerDot);
                            }
                            groupBoxCornerDot.Visible = true;
                            label_answer.Visible      = true;
                            buttonNext.Enabled        = false;
                            step_1++;
                            break;

                        case -1:
                            label1.Text        = "Линейная форма не ограничена на множестве планов задачи.";
                            buttonNext.Enabled = false;
                            MessageBox.Show("Линейная форма не ограничена на множестве планов задачи.", "");
                            step_1++;
                            break;
                        }
                        break;

                    case 0:
                        if (simplextable.ResponseCheck() == 1)
                        {
                            // Если симплекс таблица решена
                            step++;
                            if (MinMax == 0)
                            {
                                if (Radical_or_Decimal)
                                {
                                    label_answer.Text = "Ответ :" + simplextable.Response();
                                }
                                else
                                {
                                    label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction();
                                }
                            }
                            else
                            {
                                if (Radical_or_Decimal)
                                {
                                    label_answer.Text = "Ответ: " + simplextable.Response() * (-1);
                                }
                                else
                                {
                                    label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction() * (-1);
                                }
                            }

                            // Выводим точку X*
                            if (corner_dot_was_added == false)
                            {
                                corner_dot_was_added = true;
                                //добавляем точку
                                addGridParam(simplextable.ResponseDot(dataGridView3), dataGridViewCornerDot);
                            }
                            groupBoxCornerDot.Visible = true;
                            label_answer.Visible      = true;
                            buttonNext.Enabled        = false;
                            step_1++;
                        }
                        else
                        {
                            step++;
                            label1.Text = "Метод искусственного базиса. Выбор опорного элемента.";
                            //выбор опорного
                            simplextable.SelectionOfTheSupportElement(dataGridView3);
                        }
                        break;

                    case -1:
                        MessageBox.Show("Решения нет");
                        break;
                    }
                }
                // Симплекс метод
                else
                {
                    switch (simplextable.ResponseCheck())
                    {
                    case 0:
                        //выбор опорного
                        simplextable.SelectionOfTheSupportElement(dataGridView3);
                        label1.Text = "Симплекс таблица";
                        step_1++;
                        break;

                    case 1:
                        // Подставляем ответ
                        if (MinMax == 0)
                        {
                            if (Radical_or_Decimal)
                            {
                                label_answer.Text = "Ответ :" + simplextable.Response();
                            }
                            else
                            {
                                label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction();
                            }
                        }
                        else
                        {
                            if (Radical_or_Decimal)
                            {
                                label_answer.Text = "Ответ: " + simplextable.Response() * (-1);
                            }
                            else
                            {
                                label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction() * (-1);
                            }
                        }

                        // Выводим точку X*
                        if (corner_dot_was_added == false)
                        {
                            corner_dot_was_added = true;
                            //добавляем
                            addGridParam(simplextable.ResponseDot(dataGridView3), dataGridViewCornerDot);
                        }
                        groupBoxCornerDot.Visible = true;
                        label_answer.Visible      = true;
                        buttonNext.Enabled        = false;
                        step_1++;
                        break;

                    case -1:
                        label1.Text = "Линейная форма не ограничена на множестве планов задачи.";
                        MessageBox.Show("Линейная форма не ограничена на множестве планов задачи.", "");
                        buttonNext.Enabled = false;
                        step_1++;
                        break;
                    }
                }
            }
            catch (Exception d)
            {
                MessageBox.Show(d.Message);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Выполнение.
        /// </summary>
        private void Implementation()
        {
            if (Radical_or_Decimal)
            {
                //создаём сиплекс-таблицу
                simplextable = new Simplex(number_of_basix, number_of_free_variables, ogr, cel_function, false, Radical_or_Decimal);
                //отрисовываем симплекс таблицу
                simplextable.DrawSimplexTable(ogr, dataGridView3);
            }
            else
            {
                //создаём сиплекс-таблицу
                simplextable = new Simplex(number_of_basix, number_of_free_variables, ogr_with_radicals, cel_function_with_radicals, false, Radical_or_Decimal);
                //отрисовываем симплекс таблицу
                simplextable.DrawSimplexTable(ogr_with_radicals, dataGridView3);
            }

            if (simplextable.ResponseCheck() == 1)
            {
                //    tabControl1.TabPages[0].Text = "Холостой шаг: Метод искусственного базиса. Выбор опорного элемента.";
                //холостой шаг
                //simplextable.IdleStep();
            }
            else
            {
                //   tabControl1.TabPages[0].Text = "Шаг " + step + ": Метод искусственного базиса. Выбор опорного элемента.";
                //выбор опорного
                simplextable.SelectionRandomSupportElement();
            }

            // Делаем пока таблица искус базиса не вышла в ноль
            while (ArtificalBasixGoToNull == false)
            {
                //смена местами переменной + буферизация
                simplextable.ChangeOfVisualizationVariables(dataGridView3);
                //вычисление согласно выбранному опорному элементу
                simplextable.CalculateSimplexTable(simplextable.row_of_the_support_element, simplextable.column_of_the_support_element);

                // обновление данных ячеек таблицы
                if (Radical_or_Decimal)
                {
                    addGridParam_for_simplex_elements(simplextable.simplex_elements, dataGridView3);
                }
                else
                {
                    addGridParam_for_simplex_elements(simplextable.simplex_elements_with_radicals, dataGridView3);
                }

                switch (simplextable.ArtificialResponseCheck(variable_visualization, dataGridView3))
                {
                case 1:
                    //MessageBox.Show("Таблица пришла в ноль!");

                    if (!ArtificalBasixGoToNull)
                    {
                        // Удаляем столбцы с искусственными переменными.
                        simplextable.DeleteArtificalBasix(dataGridView3);

                        // Считываем ограничения заного
                        if (Radical_or_Decimal)
                        {
                            ogr = new List <List <double> >();
                            read_grids(dataGridView3, ogr);
                            simplextable.simplex_elements = ogr;
                            // удаляем строку с нулями из элементов симплекс таблицы
                            simplextable.simplex_elements.RemoveAt(simplextable.simplex_elements.Count - 1);
                            // удаляем последнюю строку с нулями из датаГрид
                            dataGridView3.Rows.RemoveAt(dataGridView3.Rows.Count - 1);
                            // отображаем новые данные
                            addGridParam_for_simplex_elements(simplextable.simplex_elements, dataGridView3);
                        }

                        else
                        {
                            ogr_with_radicals = new List <List <Fractions> >();
                            read_grids(dataGridView3, ogr_with_radicals);
                            simplextable.simplex_elements_with_radicals = ogr_with_radicals;
                            // удаляем строку с нулями из элементов симплекс таблицы
                            simplextable.simplex_elements_with_radicals.RemoveAt(simplextable.simplex_elements_with_radicals.Count - 1);
                            // удаляем последнюю строку с нулями из датаГрид
                            dataGridView3.Rows.RemoveAt(dataGridView3.Rows.Count - 1);
                            // отображаем новые данные
                            addGridParam_for_simplex_elements(simplextable.simplex_elements_with_radicals, dataGridView3);
                        }

                        // Высчитываем последнюю строку
                        simplextable.CalculateCelRow(dataGridView3);
                    }

                    ArtificalBasixGoToNull = true;

                    // Если ответ готов сразу же
                    switch (simplextable.ResponseCheck())
                    {
                    case 0:
                        //выбор опорного
                        simplextable.SelectionRandomSupportElement();
                        break;

                    case 1:
                        if (MinMax == 0)
                        {
                            if (Radical_or_Decimal)
                            {
                                label_answer.Text = "Ответ :" + simplextable.Response();
                            }
                            else
                            {
                                label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction();
                            }
                        }
                        else
                        {
                            if (Radical_or_Decimal)
                            {
                                label_answer.Text = "Ответ: " + simplextable.Response() * (-1);
                            }
                            else
                            {
                                label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction() * (-1);
                            }
                        }

                        // Выводим точку X*
                        if (corner_dot_was_added == false)
                        {
                            corner_dot_was_added = true;
                            //добавляем точку
                            addGridParam(simplextable.ResponseDot(dataGridView3), dataGridViewCornerDot);
                        }

                        break;

                    case -1:
                        //   tabControl1.TabPages[0].Text = "Линейная форма не ограничена сверху на множествен планов задачи.";

                        MessageBox.Show("Линейная форма не ограничена сверху на множествен планов задачи", "");

                        break;
                    }
                    break;

                case 0:
                    if (simplextable.ResponseCheck() == 1)
                    {
                        // Если симплекс таблица решена
                        if (MinMax == 0)
                        {
                            if (Radical_or_Decimal)
                            {
                                label_answer.Text = "Ответ :" + simplextable.Response();
                            }
                            else
                            {
                                label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction();
                            }
                        }
                        else
                        {
                            if (Radical_or_Decimal)
                            {
                                label_answer.Text = "Ответ: " + simplextable.Response() * (-1);
                            }
                            else
                            {
                                label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction() * (-1);
                            }
                        }

                        // Выводим точку X*
                        if (corner_dot_was_added == false)
                        {
                            corner_dot_was_added = true;
                            //добавляем точку
                            addGridParam(simplextable.ResponseDot(dataGridView3), dataGridViewCornerDot);
                        }
                    }
                    else
                    {
                        //  tabControl1.TabPages[0].Text = "Шаг " + step + ": Метод искусственного базиса. Выбор опорного элемента.";
                        //выбор опорного
                        simplextable.SelectionRandomSupportElement();
                    }
                    break;

                case -1:
                    //  MessageBox.Show("Решения не имеет");
                    break;
                }
            }

            // Переходим к симплекс таблице, если она не имеет решения или пока ещё не решена, и решаем её до тех пор
            while (simplextable.ResponseCheck() != 1 && simplextable.ResponseCheck() != -1)
            {
                //смена местами переменной + буферизация
                simplextable.ChangeOfVisualizationVariables(dataGridView3);
                //вычисление согласно выбранному опорному элементу
                simplextable.CalculateSimplexTable(simplextable.row_of_the_support_element, simplextable.column_of_the_support_element);

                // обновление данных ячеек таблицы
                if (Radical_or_Decimal)
                {
                    addGridParam_for_simplex_elements(simplextable.simplex_elements, dataGridView3);
                }
                else
                {
                    addGridParam_for_simplex_elements(simplextable.simplex_elements_with_radicals, dataGridView3);
                }

                switch (simplextable.ResponseCheck())
                {
                case 0:
                    //выбор опорного
                    simplextable.SelectionRandomSupportElement();
                    break;

                case 1:
                    // Подставляем ответ
                    if (MinMax == 0)
                    {
                        if (Radical_or_Decimal)
                        {
                            label_answer.Text = "Ответ :" + simplextable.Response();
                        }
                        else
                        {
                            label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction();
                        }
                    }
                    else
                    {
                        if (Radical_or_Decimal)
                        {
                            label_answer.Text = "Ответ: " + simplextable.Response() * (-1);
                        }
                        else
                        {
                            label_answer.Text = "Ответ :" + simplextable.Responce_for_radicals().Reduction() * (-1);
                        }
                    }

                    // Выводим точку X*
                    if (corner_dot_was_added == false)
                    {
                        corner_dot_was_added = true;
                        //добавляем точку
                        addGridParam(simplextable.ResponseDot(dataGridView3), dataGridViewCornerDot);
                    }

                    break;

                case -1:
                    //  tabControl1.TabPages[0].Text = "Линейная форма не ограничена сверху на множествен планов задачи.";
                    MessageBox.Show("Линейная форма не ограничена сверху на множествен планов задачи.", "");
                    break;
                }
            }
        }