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; } } }
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(); } } }