/// <summary>
        /// Выполнение.
        /// </summary>
        private void Implementation()
        {
            //Прямой ход метода Гаусса для приведения к треугольному виду.
            MatrixTransformation.Gauss(elements, CornerDot, variable_visualization);

            //Выражение базисных переменных.
            MatrixTransformation.HoistingMatrix(elements, number_of_basix);

            //создаём сиплекс-таблицу
            simplextable = new SimplexTable(number_of_basix, number_of_free_variables, variable_visualization, elements, target_function_elements, true);
            MainGrid.Children.Add(simplextable);

            int responce;
            int step = 1;

            while (true)
            {
                if ((responce = simplextable.ResponseCheck()) == 0)
                {
                    //выбор любого опорного
                    simplextable.SelectionRandomSupportElement();
                    //смена визуализации переменных в симплек-таблице
                    simplextable.ChangeOfVisualWithoutBuffer();
                    //вычисление согласно выбранному опорному элементу
                    simplextable.CalculateSimplexTable();
                    //обновление данных сиплекс-таблицы
                    simplextable.UpdateSimplexTableValues();
                    //номер угловой точки
                    simplextable.CornerPoint(step);
                    step++;
                }
                else if (responce == 1)
                {
                    if (MinMax == 0)
                    {
                        labelanswer.Content = "Ответ :" + simplextable.Response() * (-1);
                    }
                    else
                    {
                        labelanswer.Content = "Ответ :" + simplextable.Response();
                    }
                    //добавляем точку
                    corner_dot = simplextable.ResponseCornerDot(step - 1);
                    MainGrid.Children.Add(corner_dot);
                    buttonToMainWindow.Visibility = Visibility.Visible;
                    break;
                }
                else if (responce == -1)
                {
                    labelanswer.Content           = "Задача не разрешима!";
                    buttonToMainWindow.Visibility = Visibility.Visible;
                    break;
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Кнопка "вперёд".
        /// </summary>
        private void buttonNext_Click(object sender, RoutedEventArgs e)
        {
            switch (step)
            {
            case 0:
                //буферизация данных
                BufferingTableValues();
                try
                {
                    buffer_variable_visualization = new int[variable_visualization.Length];
                    for (int i = 0; i < variable_visualization.Length; i++)
                    {
                        buffer_variable_visualization[i] = variable_visualization[i];
                    }
                    //прямой ход Гаусса
                    MatrixTransformation.Gauss(elements, CornerDot, variable_visualization);
                }
                catch (Exception d)
                {
                    MessageBox.Show(d.Message);
                    buttonToMainWindow.Visibility = Visibility.Visible;
                }
                //Обновление визуализации переменных.
                UpdateVisualVariables();
                //обновление таблицы
                UpdateTableValues();
                step++;
                labelsteps.Content = "Шаг 1: Прямой ход метода Гаусса.";
                break;

            case 1:
                //буферизация данных
                BufferingTableValues();
                //Выражение базисных переменных.
                MatrixTransformation.HoistingMatrix(elements, number_of_permutations);
                //обновление таблицы
                UpdateTableValues();
                step++;
                labelsteps.Content = "Шаг 2: Выражение базисных переменных.";
                break;

            case 2:
                //скрываем матрицу
                scrollgaussgrid.Visibility = Visibility.Hidden;
                if (simplex_table_was_draw == false)
                {
                    simplextable = new SimplexTable(number_of_permutations, number_of_free_variables, variable_visualization, elements, target_function_elements, true);
                    MainGrid.Children.Add(simplextable);
                    //Симплекс-таблица была создана
                    simplex_table_was_draw = true;
                }
                //показываем симплекс-таблицу
                simplextable.Visibility = Visibility.Visible;
                switch (simplextable.ResponseCheck())
                {
                case 0:
                    step++;
                    labelsteps.Content = "Шаг 3: Симплекс-таблица.";
                    break;

                case 1:
                    step++;
                    if (MinMax == 0)
                    {
                        labelsteps.Content = "Ответ :" + simplextable.Response() * (-1);
                    }
                    else
                    {
                        labelsteps.Content = "Ответ :" + simplextable.Response();
                    }
                    if (corner_dot_was_added == false)
                    {
                        //добавляем точку
                        corner_dot = simplextable.ResponseCornerDot(step);
                        MainGrid.Children.Add(corner_dot);
                        corner_dot_was_added = true;
                    }
                    //показываем угловую точку решения
                    corner_dot.Visibility         = Visibility.Hidden;
                    buttonToMainWindow.Visibility = Visibility.Visible;
                    break;

                case -1:
                    step++;
                    labelsteps.Content            = "Задача не разрешима!";
                    buttonToMainWindow.Visibility = Visibility.Visible;
                    break;
                }
                break;

            case 3:
                //выбор опорного
                simplextable.SelectionOfTheSupportElement();
                //обновление данных сиплекс-таблицы
                simplextable.UpdateSimplexTableValues();
                step++;
                labelsteps.Content = "Шаг " + step + ": Симплекс-таблица. Выбор опорного элемента.";
                break;

            default:
                try
                {
                    //выбран ли опорный элемент
                    simplextable.ButtonPressedOrNot();
                    //Смена местами визуализаций переменных(после выбора опорного элемента) + буферизация.
                    simplextable.ChangeOfVisualizationVariables();
                    //буферизация данных
                    simplextable.BufferingSimplexTableValues(step);
                    //удаляем кнопки
                    simplextable.DeleteButtons();
                    //вычисление согласно выбранному опорному элементу
                    simplextable.CalculateSimplexTable();
                    //обновление данных сиплекс-таблицы
                    simplextable.UpdateSimplexTableValues();
                    switch (simplextable.ResponseCheck())
                    {
                    case 0:
                        step++;
                        labelsteps.Content = "Шаг " + step + ": Симплекс-таблица. Выбор опорного элемента.";
                        //выбор опорного
                        simplextable.SelectionOfTheSupportElement();
                        break;

                    case 1:
                        step++;
                        if (MinMax == 0)
                        {
                            labelsteps.Content = "Ответ :" + simplextable.Response() * (-1);
                        }
                        else
                        {
                            labelsteps.Content = "Ответ :" + simplextable.Response();
                        }
                        //если не была добавлена, то добавляем
                        if (corner_dot_was_added == false)
                        {
                            //добавляем точку
                            corner_dot = simplextable.ResponseCornerDot(step - 4);
                            MainGrid.Children.Add(corner_dot);
                            corner_dot_was_added = true;
                        }
                        //показываем угловую точку решения
                        corner_dot.Visibility         = Visibility.Visible;
                        buttonToMainWindow.Visibility = Visibility.Visible;
                        break;

                    case -1:
                        step++;
                        labelsteps.Content            = "Задача не разрешима!";
                        buttonToMainWindow.Visibility = Visibility.Visible;
                        break;
                    }
                    simplextable.CornerPoint(step - 4);
                }
                catch (Exception d)
                {
                    MessageBox.Show(d.Message);
                }
                break;
            }
        }
        private void Implementation()
        {
            //создаём сиплекс-таблицу
            simplextable = new SimplexTable(number_of_basix, number_of_free_variables, variable_visualization, elements, target_function_elements, false);
            MainGrid.Children.Add(simplextable);
            //добавляем тильду
            simplextable.AddTilde();

            while (simplextable.ArtificialResponseCheck() != true)
            {
                if (simplextable.ResponseCheck() == 1)
                {
                    //холостой шаг
                    simplextable.RandomIdleStep();
                    this.Width = 720;
                    //Смена местами визуализаций переменных(после выбора опорного элемента) + буферизация.
                    simplextable.ChangeOfVisualizationVariables();
                    //вычисление согласно выбранному опорному элементу
                    simplextable.CalculateSimplexTable();
                    //обновление данных сиплекс-таблицы
                    simplextable.UpdateSimplexTableValues();
                    simplextable.CornerPoint(step);
                }
                else
                {
                    //выбор опорного
                    simplextable.SelectionRandomSupportElement();
                    this.Width = 651;
                    //Смена местами визуализаций переменных(после выбора опорного элемента) + буферизация.
                    simplextable.ChangeOfVisualizationVariables();
                    //вычисление согласно выбранному опорному элементу
                    simplextable.CalculateSimplexTable();
                    //обновление данных сиплекс-таблицы
                    simplextable.UpdateSimplexTableValues();
                    simplextable.CornerPoint(step);
                }
            }

            variable_visualization = simplextable.ReturnVariableVisualization();
            elements = simplextable.ReturnElements();
            elements.RemoveAt(elements.Count - 1);

            //организация массива для симплекс-метода
            List <List <double> > temp_elements = new List <List <double> >();

            for (int i = 0; i < number_of_basix; i++)
            {
                temp_elements.Add(new List <double>());
                for (int j = 0; j < number_of_basix; j++)
                {
                    if (temp_elements[i].Count == i)
                    {
                        temp_elements[i].Add(1);
                    }
                    else
                    {
                        temp_elements[i].Add(0);
                    }
                }
            }
            for (int i = 0; i < number_of_basix; i++)
            {
                temp_elements[i].AddRange(elements[i]);
            }

            elements = temp_elements;

            simplextable.HideSimplexTable();
            simplextable1 = new SimplexTable(number_of_basix, variable_visualization.Length - number_of_basix, variable_visualization, elements, target_function_elements, true);
            MainGrid.Children.Add(simplextable1);

            step = 0;

            while (simplextable1.ResponseCheck() != 1 && simplextable1.ResponseCheck() != -1)
            {
                //выбор опорного
                simplextable1.SelectionRandomSupportElement();
                //Смена местами визуализаций переменных(после выбора опорного элемента) + буферизация.
                simplextable1.ChangeOfVisualizationVariables();
                //вычисление согласно выбранному опорному элементу
                simplextable1.CalculateSimplexTable();
                //обновление данных сиплекс-таблицы
                simplextable1.UpdateSimplexTableValues();
            }

            if (simplextable1.ResponseCheck() == 1)
            {
                if (MinMax == 0)
                {
                    labelanswer.Content = "Ответ :" + simplextable1.Response() * (-1);
                }
                else
                {
                    labelanswer.Content = "Ответ :" + simplextable1.Response();
                }
                //добавляем точку
                corner_dot = simplextable1.ResponseCornerDot(step);
                MainGrid.Children.Add(corner_dot);
                buttonToMainWindow.Visibility = Visibility.Visible;
            }
            else
            {
                labelanswer.Content           = "Задача не разрешима!";
                buttonToMainWindow.Visibility = Visibility.Visible;
            }

            step++;
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Кнопка "Вперёд".
        /// </summary>
        private void buttonNext_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                //для запоминания типа шага
                if (simplextable.ResponseCheck() == 1)
                {
                    type_of_step.Add(false);
                }
                else
                {
                    type_of_step.Add(true);
                }

                //выбран ли опорный элемент
                simplextable.ButtonPressedOrNot();
                //Смена местами визуализаций переменных(после выбора опорного элемента) + буферизация.
                simplextable.ChangeOfVisualizationVariables();
                //буферизация данных
                simplextable.BufferingSimplexTableValuesTest();
                //удаляем кнопки
                simplextable.DeleteButtons();
                //вычисление согласно выбранному опорному элементу
                simplextable.CalculateSimplexTable();
                //обновление данных сиплекс-таблицы
                simplextable.UpdateSimplexTableValues();
                simplextable.CornerPoint(step);
                //проверка решения
                switch (simplextable.ArtificialResponseCheck())
                {
                case true:
                    variable_visualization = simplextable.ReturnVariableVisualization();
                    elements = simplextable.ReturnElements();
                    elements.RemoveAt(elements.Count - 1);

                    //организация массива для симплекс-метода
                    List <List <double> > temp_elements = new List <List <double> >();
                    for (int i = 0; i < number_of_basix; i++)
                    {
                        temp_elements.Add(new List <double>());
                        for (int j = 0; j < number_of_basix; j++)
                        {
                            if (temp_elements[i].Count == i)
                            {
                                temp_elements[i].Add(1);
                            }
                            else
                            {
                                temp_elements[i].Add(0);
                            }
                        }
                    }
                    for (int i = 0; i < number_of_basix; i++)
                    {
                        temp_elements[i].AddRange(elements[i]);
                    }

                    elements = temp_elements;

                    buttonBack.Visibility  = Visibility.Hidden;
                    buttonNext.Visibility  = Visibility.Hidden;
                    buttonBack1.Visibility = Visibility.Visible;
                    buttonNext1.Visibility = Visibility.Visible;
                    simplextable.HideSimplexTable();
                    step++;
                    if (simplex_table_was_draw == false)
                    {
                        simplextable1 = new SimplexTable(number_of_basix, variable_visualization.Length - number_of_basix, variable_visualization, elements, target_function_elements, true);
                        MainGrid.Children.Add(simplextable1);
                        //Симплекс-таблица была создана
                        simplex_table_was_draw = true;
                    }
                    else
                    {
                        simplextable1.DeleteButtons();
                        MainGrid.Children.Add(simplextable1);
                        simplextable1.SetVariableVisualization(simplextable.ReturnVariableVisualization());
                        simplextable1.SetElements(elements);
                        simplextable1.UpdateValuesNewStage();
                    }
                    //проверка решения
                    switch (simplextable1.ResponseCheck())
                    {
                    case 0:
                        //выбор опорного
                        simplextable1.SelectionOfTheSupportElement();
                        labelsteps.Content = "Шаг " + step + ": Симплекс-таблица.";
                        break;

                    case 1:
                        if (MinMax == 0)
                        {
                            labelsteps.Content = "Ответ :" + simplextable1.Response() * (-1);
                        }
                        else
                        {
                            labelsteps.Content = "Ответ :" + simplextable1.Response();
                        }
                        if (corner_dot_was_added == false)
                        {
                            //добавляем точку
                            corner_dot = simplextable1.ResponseCornerDot(0);
                            MainGrid.Children.Add(corner_dot);
                            corner_dot_was_added = true;
                        }
                        corner_dot.Visibility         = Visibility.Visible;
                        buttonToMainWindow.Visibility = Visibility.Visible;
                        buttonNext1.Visibility        = Visibility.Hidden;
                        break;

                    case -1:
                        labelsteps.Content            = "Задача не разрешима!";
                        buttonToMainWindow.Visibility = Visibility.Visible;
                        buttonNext1.Visibility        = Visibility.Hidden;
                        break;
                    }
                    break;

                case false:
                    if (simplextable.ResponseCheck() == 1)
                    {
                        step++;
                        labelsteps.Content = "Холостой шаг: Метод искусственного базиса. Выбор опорного элемента.";
                        //холостой шаг
                        simplextable.IdleStep();
                        this.Width = 720;
                    }
                    else
                    {
                        step++;
                        labelsteps.Content = "Шаг " + step + ": Метод искусственного базиса. Выбор опорного элемента.";
                        //выбор опорного
                        simplextable.SelectionOfTheSupportElement();
                        this.Width = 651;
                    }
                    break;
                }
            }
            catch (Exception d)
            {
                MessageBox.Show(d.Message);
            }
        }