/// <summary> /// Конструктор для авто-режима с задачей /// </summary> /// <param name="problem"></param> public AutoStepWindow(LinearProgrammingProblem problem) { this.Problem = problem; // Инициализируем компоненты окна InitializeComponent(); // Заносим параметры в ячейки DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.Restrictions, true); if (Problem.CornerDot != null) { Problem.TransformColumnsForCornerDot(_dataGridViewProblem); } //Процесс выполнения. Implementation(); }
/// <summary> /// Конструктор для окна пошагового режима с задачей /// </summary> /// <param name="problem">Задача линейного программирования</param> public StepByStepWindow(LinearProgrammingProblem problem) { this.Problem = problem; // изначально мы на нулевом шаге this.Step = 0; // Инициализируем компоненты окна InitializeComponent(); // Добавляем в ячейки данные tabControl.TabPages[0].Text = "Матрица коэффициентов системы ограничения равенств."; DataGridWorker.SetParamToGrids(_dataGridViewProblem, Problem.Restrictions, true); if (Problem.CornerDot != null) { Problem.TransformColumnsForCornerDot(_dataGridViewProblem); } }
/// <summary> /// Кнопка "Решить" /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonSolve_Click(object sender, EventArgs e) { // Задача на минимум? bool min = radioButtonMin.Checked; // Пошаговый режим? bool stepByStepModeOn = radioButtonStepByStepMode.Checked; // Задана угловая точка? bool cornerDotOn = checkBoxCornerDot.Checked; // Создаём объект задачи LinearProgrammingProblem problem; // Инициализируем try { // Данные задачи List <List <string> > targetFunction = DataGridWorker.ReadGridsFrom(_dataGridViewTargetFunction); List <List <string> > retrictions = DataGridWorker.ReadGridsFrom(_dataGridViewRestrictions); List <List <string> > cornerDot; // Если включена угловая точка if (cornerDotOn) { cornerDot = DataGridWorker.ReadGridsFrom(_dataGridViewCornerDot); problem = new LinearProgrammingProblem(targetFunction, retrictions, cornerDot, min); // Использование LINQ var query = problem.CornerDot[0].Where(fraction => !fraction.Equals(new Fraction(0))); if (problem.Restrictions.Count != query.Count()) { throw new Exception("Невозможно выразить базис с данной угловой точкой. " + "Количество ненулевых параметров начальной угловой точки не равно количеству линейно независимых строк"); } } else { problem = new LinearProgrammingProblem(targetFunction, retrictions, null, min); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при создании задачи!", MessageBoxButtons.OK); return; } // Меню // Проверяем режим switch (stepByStepModeOn) { // Если выбран пошаговый режим case true: StepByStepWindow stepByStepWindow = new StepByStepWindow(problem); stepByStepWindow.ShowDialog(); break; // Если выбран авто-режим case false: AutoStepWindow autoStepWindow = new AutoStepWindow(problem); autoStepWindow.ShowDialog(); break; } }