/// <summary> /// Основные шаги /// </summary> public void Implementation() { try { //Прямой ход метода Гаусса для приведения к треугольному виду. Problem.Gauss(); //Выражение базисных переменных и приведение к диагональному виду. Problem.HoistingMatrix(); // Обновляем параметры в ячейках DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.Restrictions, false); } catch (Exception ex) { MessageBox.Show(ex.Message, $"Ошибка при решении системы методом Гаусса.", MessageBoxButtons.OK); return; } try { // Создаём симплекс таблицу Problem.TransformGridForSimplexTable(_dataGridViewProblem); Problem.SimplexTable = new SimplexTable(_dataGridViewProblem); } catch (Exception ex) { MessageBox.Show(ex.Message, $"Ошибка создания симплекс таблицы!", MessageBoxButtons.OK); return; } int responce; int step = 1; while (true) { // Проверяем симплекс таблицу на решённость if ((responce = Problem.SimplexTable.ResponseCheck()) == 0) { try { //выбор любого опорного Problem.SimplexTable.SelectFirstSupportElement(); //меняем местами переменные Problem.SimplexTable.ChangeHeaders(_dataGridViewProblem); // высчитывание по опорному Problem.SimplexTable.CalculateSimplexTable(); // Обновление ячеек DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.SimplexTable.SimplexTableElements, false); step++; } catch (Exception ex) { MessageBox.Show(ex.Message, $"Ошибка при выборе опорных элементов на {step} шаге.", MessageBoxButtons.OK); return; } } else if (responce == 1) { tabControl.TabPages[0].Text = "Ответ готов!"; if (Problem.Min == false) { labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response(); } else { labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response() * (-1); } if (cornerDotAnswerWasAdded == false) { //добавляем угловую точку решения (X*) DataGridWorker.SetParamToGrids( _dataGridViewCornerDot, Problem.ResponseCornerDot(_dataGridViewProblem), true); cornerDotAnswerWasAdded = true; } break; } else if (responce == -1) { MessageBox.Show("Задача не разрешима!"); tabControl.TabPages[0].Text = "Задача не разрешима!"; break; } } }
/// <summary> /// Кнопка "Далее" /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonNext_Click(object sender, EventArgs e) { switch (Step) { case 0: try { // Буферизируем данные BufferingTableValues(Problem.ToFractionList(DataGridWorker.ReadGridsFrom(_dataGridViewProblem))); // Прямой ход Гаусса Problem.Gauss(); // Обновляем параметры DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.Restrictions, false); Step++; tabControl.TabPages[0].Text = "Шаг 1: Прямой ход метода Гаусса."; } catch (Exception ex) { MessageBox.Show(ex.Message, $"Ошибка на {Step} шаге!", MessageBoxButtons.OK); } break; case 1: try { // Буферизируем данные BufferingTableValues(Problem.ToFractionList(DataGridWorker.ReadGridsFrom(_dataGridViewProblem))); // Выражение базисных переменных + обратный ход Гаусса Problem.HoistingMatrix(); // Обновляем параметры DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.Restrictions, false); Step++; tabControl.TabPages[0].Text = "Шаг 2: Выражение базисных переменных."; } catch (Exception ex) { MessageBox.Show(ex.Message, $"Ошибка на {Step} шаге!", MessageBoxButtons.OK); } break; case 2: try { // Буферизируем данные BufferingTableValues(Problem.ToFractionList(DataGridWorker.ReadGridsFrom(_dataGridViewProblem))); BufferingHeaders(_dataGridViewProblem); if (simplexTableWasDraw == false) { Problem.TransformGridForSimplexTable(_dataGridViewProblem); Problem.SimplexTable = new SimplexTable(_dataGridViewProblem); simplexTableWasDraw = true; } } catch (Exception ex) { MessageBox.Show(ex.Message, $"Ошибка создания симплекс таблицы на {Step} шаге!", MessageBoxButtons.OK); return; } // Если симплекс таблица создалась и отрисовалась успешно // Проверяеем её на ответ switch (Problem.SimplexTable.ResponseCheck()) { case 0: // Продолжаем искать решение Step++; tabControl.TabPages[0].Text = "Шаг 3: Симплекс-таблица."; break; case 1: // Если ответ готов сразу без выбора опорного элемента tabControl.TabPages[0].Text = "Ответ готов!"; Step++; labelAnswer.Visible = true; groupBoxCornerDot.Visible = true; buttonNext.Enabled = false; // Подставляем ответ if (Problem.Min == false) { labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response(); } else { labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response() * (-1); } // Выводим угловую точку ответа (X*) if (cornerDotAnswerWasAdded == false) { //добавляем точку DataGridWorker.SetParamToGrids( _dataGridViewCornerDot, Problem.ResponseCornerDot(_dataGridViewProblem), true); cornerDotAnswerWasAdded = true; } break; case -1: Step++; MessageBox.Show("Задача не разрешима!"); tabControl.TabPages[0].Text = "Задача не разрешима!"; buttonNext.Enabled = false; break; } break; case 3: try { BufferingTableValues(Problem.SimplexTable.SimplexTableElements); //выбор опорного Problem.SimplexTable.SelectionOfTheSupportElements(_dataGridViewProblem); Step++; tabControl.TabPages[0].Text = $"Шаг {Step}: Выбор опорного элемента"; } catch (Exception ex) { MessageBox.Show(ex.Message, $"Ошибка при выборе опорных элементов на {Step} шаге.", MessageBoxButtons.OK); } break; default: try { // Проверяем, выбран ли опорный элемент Problem.SimplexTable.SupportElementPressedOrNot(_dataGridViewProblem); // Меняем хэдэры колонки и строки местами Problem.SimplexTable.ChangeHeaders(_dataGridViewProblem); // Буферизируем симплекс таблицу BufferingTableValues(Problem.SimplexTable.SimplexTableElements); // Удаляем подсвеченные ячейки UncolorGreenGrids(_dataGridViewProblem); // Вычисление симплекс таблицы по выбранному опорному элементу Problem.SimplexTable.CalculateSimplexTable(); // Обновление ячеек DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.SimplexTable.SimplexTableElements, false); } catch (Exception ex) { MessageBox.Show(ex.Message, $"Ошибка при выборе опорного элемента на шаге {Step}", MessageBoxButtons.OK); return; } switch (Problem.SimplexTable.ResponseCheck()) { case 0: Step++; tabControl.TabPages[0].Text = $"Шаг {Step}: Выбор опорного элемента"; //выбор опорного Problem.SimplexTable.SelectionOfTheSupportElements(_dataGridViewProblem); break; case 1: tabControl.TabPages[0].Text = "Ответ готов!"; Step++; labelAnswer.Visible = true; groupBoxCornerDot.Visible = true; if (Problem.Min == false) { labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response(); } else { labelAnswer.Text = "Ответ :" + Problem.SimplexTable.Response() * (-1); } if (cornerDotAnswerWasAdded == false) { //добавляем угловую точку решения (X*) DataGridWorker.SetParamToGrids( _dataGridViewCornerDot, Problem.ResponseCornerDot(_dataGridViewProblem), true); cornerDotAnswerWasAdded = true; } buttonNext.Enabled = false; break; case -1: Step++; MessageBox.Show("Задача не разрешима!"); tabControl.TabPages[0].Text = "Задача не разрешима!"; buttonNext.Enabled = false; break; } break; } }