Ejemplo n.º 1
0
        private void Implementation()
        {
            if (Radical_or_Decimal)
            {
                //Прямой ход метода Гаусса для приведения к треугольному виду.
                StepsSolve.Gauss(ogr, CornerDot);
                //Выражение базисных переменных и приведение к диагональному виду.
                StepsSolve.HoistingMatrix(ogr, number_of_basix);
                // Обновляем данные на таблице
                //Обновление визуализации переменных.
                if (CornerDot)
                {
                    addGridParam(ogr, dataGridView3, variable_visualization);
                }
                else
                {
                    addGridParam(ogr, dataGridView3);
                }
                //создаём сиплекс-таблицу
                simplextable = new Simplex(number_of_basix, number_of_free_variables, ogr, cel_function, true, Radical_or_Decimal);
                DrawSimplexTable(ogr);
            }
            else
            {
                //Прямой ход метода Гаусса для приведения к треугольному виду.
                StepsSolve.Gauss(ogr_with_radicals, CornerDot);
                //Выражение базисных переменных и приведение к диагональному виду.
                StepsSolve.HoistingMatrix(ogr_with_radicals, number_of_basix);
                //Обновление визуализации переменных.
                if (CornerDot)
                {
                    addGridParam(ogr_with_radicals, dataGridView3, variable_visualization);
                }
                else
                {
                    addGridParam(ogr_with_radicals, dataGridView3);
                }
                //создаём сиплекс-таблицу
                simplextable = new Simplex(number_of_basix, number_of_free_variables, ogr_with_radicals, cel_function_with_radicals, true, Radical_or_Decimal);
                DrawSimplexTable(ogr_with_radicals);
            }

            int responce;
            int step = 1;

            while (true)
            {
                if ((responce = simplextable.ResponseCheck()) == 0)
                {
                    //выбор любого опорного
                    simplextable.SelectionRandomSupportElement();
                    //меняем местами переменные
                    simplextable.ChangeOfVisualWithoutBuffer(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);
                    }
                    step++;
                }
                else if (responce == 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(ResponseDot(), dataGridViewCornerDot);
                    }
                    break;
                }
                else if (responce == -1)
                {
                    MessageBox.Show("Задача не разрешима");
                    //  tabControl1.TabPages[0].Text = "Задача не разрешима!";
                    break;
                }
            }
        }
Ejemplo n.º 2
0
        private void button1_Click(object sender, EventArgs e)
        {
            // Для работы с десятичными
            List <List <double> > ogr          = new List <List <double> >();
            List <List <double> > cel_function = new List <List <double> >();
            // Для работы с обыкновенными дробями
            List <List <Fractions> > ogr_with_radicals          = new List <List <Fractions> >();
            List <List <Fractions> > cel_function_with_radicals = new List <List <Fractions> >();

            // Если выбраны десятичные дроби
            if (desyat_ili_obikn)
            {
                try
                {
                    // Считываем целевую функцию и ограничения как десятичные дроби
                    read_grids(dataGridView1, cel_function);
                    read_grids(dataGridView2, ogr);
                }
                catch (Exception d)
                {
                    MessageBox.Show(d.Message, "Ошибка");
                    return;
                }
            }
            // Если выбраны обыкновенные дроби
            else
            {
                try
                {
                    // Считываем целевую функцию и ограничения как обыкновенные дроби
                    read_grids(dataGridView1, cel_function_with_radicals);
                    read_grids(dataGridView2, ogr_with_radicals);
                }
                catch (Exception d)
                {
                    MessageBox.Show(d.Message, "Ошибка");
                    return;
                }
            }

            //вспомогательный массив для подсчёта ранга для десятичных
            List <List <double> > copy_elements = new List <List <double> >();
            //вспомогательный массив для подсчёта ранга для обыкновенных дробей
            List <List <Fractions> > copy_elements_with_radicals = new List <List <Fractions> >();
            // Высчитываем ранг матрицы, но по копированной матрице
            int rang = 0;

            if (desyat_ili_obikn)
            {
                // Копируем элементы для десятичных
                for (int i = 0; i < ogr.Count; i++)
                {
                    copy_elements.Add(new List <double>());
                    for (int j = 0; j < ogr[0].Count; j++)
                    {
                        copy_elements[i].Add(ogr[i][j]);
                    }
                }
                rang = RangOfMatrix(copy_elements);
            }
            else
            {
                // Копируем элементы если выбраны дроби
                for (int i = 0; i < ogr_with_radicals.Count; i++)
                {
                    copy_elements_with_radicals.Add(new List <Fractions>());
                    for (int j = 0; j < ogr_with_radicals[0].Count; j++)
                    {
                        copy_elements_with_radicals[i].Add(ogr_with_radicals[i][j]);
                    }
                }
                rang = RangOfMatrix(copy_elements_with_radicals);
            }

            // Выбран мин или макс
            int MinMax = MinMax_check(); // 0 - выбран max, 1 - выбран min

            // Определитель - выбрана ли угловая точка
            bool CornerDot = checkBoxCornerDot.Checked;

            //если выбраны пошаговый режим, симплекс-метод и задана начальная угловая точка
            if ((radioButton_step_by_step.Checked == true) && (radioButton_symplex.Checked == true) && (checkBoxCornerDot.Checked == true))
            {
                ///<summary>
                ///Корневая точка List<List<double>>
                ///</summary>
                ///

                List <List <double> >    corner_dot = new List <List <double> >();
                List <List <Fractions> > corner_dot_with_radicals = new List <List <Fractions> >();
                if (desyat_ili_obikn)
                {
                    read_grids(dataGridView_CornerDot, corner_dot);
                }
                else
                {
                    read_grids(dataGridView_CornerDot, corner_dot_with_radicals);
                }

                int index           = 0; //индекс переменной, которая является базисной
                int count_basix_var = 0; //число базисных переменных

                if (desyat_ili_obikn)
                {
                    //проверяем на возможность выражения базисных переменных для десятичных
                    for (int j = 0; j < corner_dot[0].Count; j++)
                    {
                        //проверяем базисная ли переменная
                        if (corner_dot[0][j] != 0)
                        {
                            CheckCanBeBasix(ogr, index);
                            count_basix_var++;
                        }
                        index++;
                    }
                }
                else
                {
                    //проверяем на возможность выражения базисных переменных для обыкновенных
                    for (int j = 0; j < corner_dot_with_radicals[0].Count; j++)
                    {
                        //проверяем базисная ли переменная
                        if (corner_dot_with_radicals[0][j] != 0)
                        {
                            CheckCanBeBasix(ogr_with_radicals, index);
                            count_basix_var++;
                        }
                        index++;
                    }
                }

                //проверяем совпадает ли число базисных переменных с рангом матрицы
                if (rang != count_basix_var)
                {
                    MessageBox.Show("Ранг матрицы (" + rang + ") не равен числу базисных переменных (" + count_basix_var + ").");
                    return;
                }

                if (desyat_ili_obikn)
                {
                    // Массив запоминающий индексы переменных для отображения
                    List <int> variable_visualization = new List <int>();
                    //Заполняем массив визуализации переменных. Например, для x1,x2,x3,x4 заполним [1,2,3,4].
                    for (int i = 0; i < ogr[0].Count; i++)
                    {
                        variable_visualization.Add(i + 1);
                    }

                    // Меняем колонки местами, чтобы обычный прямой ход Гаусса ставил базис именно по ненулевым столбцам корневой точки
                    ChangeColumnsForGauss(ogr, corner_dot, variable_visualization);

                    StepsSolve byStep = new StepsSolve(cel_function, ogr, MinMax, CornerDot, rang, desyat_ili_obikn, variable_visualization);
                    byStep.ShowDialog();
                }
                else
                {
                    // Массив запоминающий индексы переменных для отображения
                    List <int> variable_visualization = new List <int>();
                    //Заполняем массив визуализации переменных. Например, для x1,x2,x3,x4 заполним [1,2,3,4].
                    for (int i = 0; i < ogr_with_radicals[0].Count; i++)
                    {
                        variable_visualization.Add(i + 1);
                    }


                    // Меняем колонки местами, чтобы обычный прямой ход Гаусса ставил базис именно по ненулевым столбцам корневой точки
                    ChangeColumnsForGauss(ogr_with_radicals, corner_dot_with_radicals, variable_visualization);

                    StepsSolve byStep = new StepsSolve(cel_function_with_radicals, ogr_with_radicals, MinMax, CornerDot, rang, desyat_ili_obikn, variable_visualization);
                    byStep.ShowDialog();
                }
            }
            //если выбраны пошаговый режим и симплекс-метод БЕЗ задания начальной угловой точки
            else if ((radioButton_step_by_step.Checked == true) && (radioButton_symplex.Checked == true) && (checkBoxCornerDot.Checked == false))
            {
                // Если выбраны десятичные дроби
                if (desyat_ili_obikn == true)
                {
                    StepsSolve byStep = new StepsSolve(cel_function, ogr, MinMax, CornerDot, rang, desyat_ili_obikn);
                    byStep.ShowDialog();
                }
                // Если выбраны обыкновенные дроби
                else if (desyat_ili_obikn == false)
                {
                    StepsSolve byStep = new StepsSolve(cel_function_with_radicals, ogr_with_radicals, MinMax, CornerDot, rang, desyat_ili_obikn);
                    byStep.ShowDialog();
                }
            }
            //если выбраны автоматический режим и симплекс метод и задана начальная угловая точка
            else if ((radioButton_auto_answer.Checked == true) && (radioButton_symplex.Checked == true) && (checkBoxCornerDot.Checked == true))
            {
                ///<summary>
                ///Корневая точка List<List<double>>
                ///</summary>
                List <List <double> > corner_dot = new List <List <double> >();
                read_grids(dataGridView_CornerDot, corner_dot);

                List <List <Fractions> > corner_dot_with_radicals = new List <List <Fractions> >();
                read_grids(dataGridView_CornerDot, corner_dot_with_radicals);

                int index           = 0; //индекс переменной, которая является базисной
                int count_basix_var = 0; //число базисных переменных

                if (desyat_ili_obikn)
                {
                    //проверяем на возможность выражения базисных переменных для десятичных
                    for (int j = 0; j < corner_dot[0].Count; j++)
                    {
                        //проверяем базисная ли переменная
                        if (corner_dot[0][j] != 0)
                        {
                            CheckCanBeBasix(ogr, index);
                            count_basix_var++;
                        }
                        index++;
                    }
                }
                else
                {
                    //проверяем на возможность выражения базисных переменных для обыкновенных
                    for (int j = 0; j < corner_dot[0].Count; j++)
                    {
                        //проверяем базисная ли переменная
                        if (corner_dot_with_radicals[0][j] != 0)
                        {
                            CheckCanBeBasix(ogr_with_radicals, index);
                            count_basix_var++;
                        }
                        index++;
                    }
                }

                //проверяем совпадает ли число базисных переменных с рангом матрицы
                if (rang != count_basix_var)
                {
                    MessageBox.Show("Ранг матрицы (" + rang + ") не равен числу базисных переменных (" + count_basix_var + ").");
                    return;
                }

                if (desyat_ili_obikn)
                {
                    // Массив запоминающий индексы переменных для отображения
                    List <int> variable_visualization = new List <int>();
                    //Заполняем массив визуализации переменных. Например, для x1,x2,x3,x4 заполним [1,2,3,4].
                    for (int i = 0; i < ogr[0].Count; i++)
                    {
                        variable_visualization.Add(i + 1);
                    }

                    // Меняем колонки местами, чтобы обычный прямой ход Гаусса ставил базис именно по ненулевым столбцам корневой точки
                    ChangeColumnsForGauss(ogr, corner_dot, variable_visualization);

                    Auto byAuto = new Auto(cel_function, ogr, MinMax, CornerDot, count_basix_var, desyat_ili_obikn, variable_visualization);
                    byAuto.ShowDialog();
                }
                else
                {
                    // Массив запоминающий индексы переменных для отображения
                    List <int> variable_visualization = new List <int>();
                    //Заполняем массив визуализации переменных. Например, для x1,x2,x3,x4 заполним [1,2,3,4].
                    for (int i = 0; i < ogr_with_radicals[0].Count; i++)
                    {
                        variable_visualization.Add(i + 1);
                    }


                    // Меняем колонки местами, чтобы обычный прямой ход Гаусса ставил базис именно по ненулевым столбцам корневой точки
                    ChangeColumnsForGauss(ogr_with_radicals, corner_dot_with_radicals, variable_visualization);

                    Auto byAuto = new Auto(cel_function_with_radicals, ogr_with_radicals, MinMax, CornerDot, count_basix_var, desyat_ili_obikn, variable_visualization);
                    byAuto.ShowDialog();
                }
            }
            //если выбраны автоматический режим и симплекс метод и НЕ задана начальная угловая точка
            else if ((radioButton_auto_answer.Checked == true) && (radioButton_symplex.Checked == true) && (checkBoxCornerDot.Checked == false))
            {
                // Если выбраны десятичные дроби
                if (desyat_ili_obikn == true)
                {
                    Auto byAuto = new Auto(cel_function, ogr, MinMax, rang, desyat_ili_obikn);
                    byAuto.ShowDialog();
                }
                // Если выбраны обыкновенные дроби
                else if (desyat_ili_obikn == false)
                {
                    Auto byAuto = new Auto(cel_function_with_radicals, ogr_with_radicals, MinMax, rang, desyat_ili_obikn);
                    byAuto.ShowDialog();
                }
            }
            //если выбраны пошаговый режим и метод искусственного базиса БЕЗ задания начальной угловой точки
            else if ((radioButton_step_by_step.Checked == true) && (radioButton_imagine_b.Checked == true) && (checkBoxCornerDot.Checked == false))
            {
                if (desyat_ili_obikn)
                {
                    // Массив запоминающий индексы переменных для отображения
                    List <int> variable_visualization = new List <int>();
                    //Заполняем массив визуализации переменных. Например, для x1,x2,x3,x4 заполним [1,2,3,4].
                    for (int i = 0; i < ogr[0].Count; i++)
                    {
                        variable_visualization.Add(i + 1);
                    }

                    StepsIskBasis stepByStepArtifical = new StepsIskBasis(ogr, cel_function, rang, variable_visualization, MinMax, desyat_ili_obikn);
                    stepByStepArtifical.Show();
                }
                else
                {
                    // Массив запоминающий индексы переменных для отображения
                    List <int> variable_visualization = new List <int>();
                    //Заполняем массив визуализации переменных. Например, для x1,x2,x3,x4 заполним [1,2,3,4].
                    for (int i = 0; i < ogr_with_radicals[0].Count; i++)
                    {
                        variable_visualization.Add(i + 1);
                    }

                    StepsIskBasis stepByStepArtifical = new StepsIskBasis(ogr_with_radicals, cel_function_with_radicals, rang, variable_visualization, MinMax, desyat_ili_obikn);
                    stepByStepArtifical.Show();
                }
            }
            //если выбраны авто режим и метод искуственного базиса и БЕЗ задания начальной угловой точки
            else if ((radioButton_auto_answer.Checked == true) && (radioButton_imagine_b.Checked == true) && (checkBoxCornerDot.Checked == false))
            {
                if (desyat_ili_obikn)
                {
                    // Массив запоминающий индексы переменных для отображения
                    List <int> variable_visualization = new List <int>();
                    //Заполняем массив визуализации переменных. Например, для x1,x2,x3,x4 заполним [1,2,3,4].
                    for (int i = 0; i < ogr[0].Count; i++)
                    {
                        variable_visualization.Add(i + 1);
                    }

                    AutoIskBasis autoModeArtifical = new AutoIskBasis(ogr, cel_function, rang, variable_visualization, MinMax, desyat_ili_obikn);
                    autoModeArtifical.Show();
                }
                else
                {
                    // Массив запоминающий индексы переменных для отображения
                    List <int> variable_visualization = new List <int>();
                    //Заполняем массив визуализации переменных. Например, для x1,x2,x3,x4 заполним [1,2,3,4].
                    for (int i = 0; i < ogr_with_radicals[0].Count; i++)
                    {
                        variable_visualization.Add(i + 1);
                    }

                    AutoIskBasis autoModeArtifical = new AutoIskBasis(ogr_with_radicals, cel_function_with_radicals, rang, variable_visualization, MinMax, desyat_ili_obikn);
                    autoModeArtifical.Show();
                }
            }
        }