示例#1
0
        // удаление "опорного" столбца из таблицы
        private static void Step_deleteColumn(LinearProgrammingProblem lpp, int column, int columns, int rows,
                                              Fraction[,] matrix, string method)
        {
            Fraction[,] matrixResult = new Fraction[columns - 1, rows];
            for (int j = 0; j < column; j++)
            {
                for (int i = 0; i < rows; i++)
                {
                    matrixResult[j, i] = matrix[j, i];
                }
            }
            for (int j = column; j < columns - 1; j++)
            {
                for (int i = 0; i < rows; i++)
                {
                    matrixResult[j, i] = matrix[j + 1, i];
                }
            }
            switch (method)
            {
            case "MAB":
                lpp.methodOfArtificialBasis.Add(matrixResult);
                lpp.nowNumMatrixMAB++;
                break;

            case "SM":
                break;
            }
        }
示例#2
0
        // для чтения из файла (для функции menuItemOpen_Click)
        // заполнение gridG
        private static void FullGridG(MainWindow w, string[] linesSelectedFile)
        {
            // gridG
            int columnsG = w.gridG.ColumnDefinitions.Count;
            int rowsG    = w.gridG.RowDefinitions.Count;

            // заполнить коэф. цел. ф-ии
            for (int i = 0; i < rowsG; i++)
            {
                string[] texts;
                if (!linesSelectedFile[4 + Convert.ToInt32(linesSelectedFile[1]) + i].Equals(""))
                {
                    texts = linesSelectedFile[4 +
                                              Convert.ToInt32(linesSelectedFile[1]) + i].Trim(new
                                                                                              char[] { ';' }).Split(new char[] { ';' });
                }
                else
                {
                    MessageBox.Show("ошибка при чтении файла");
                    return;
                }
                for (int j = 0; j < columnsG - 2; j += 2)
                {
                    TextBox t = (TextBox)w.gridG.Children[i * (columnsG) + i + j];
                    t.Text = texts[j / 2];
                    CheckBox ch = (CheckBox)w.gridGF.Children[i * (columnsG) + i + j];
                    ch.IsChecked = true;
                    if (LinearProgrammingProblem.ReadText(t.Text).Numerator == 0)
                    {
                        ch.IsChecked = false;
                    }
                }
            }
            return;
        }
 private static void TransformMatrixColumnPart2(LinearProgrammingProblem lpp,
                                                Fraction[,] matrix, int column, int row, Label mes)
 {
     // вычитаем
     for (int i = 1; i < row; i++)
     {
         SubtractRow(matrix, i, row, column, mes);
         matrix[0, 0].Text = "№" + (lpp.nowNumMatrixG + 1);
         lpp.methodGauss.Add(CopyMatrix(matrix));
         lpp.nowNumMatrixG++;
     }
 }
示例#4
0
        // выбор опорного элемента
        public static void SelectSupportElem(LinearProgrammingProblem lpp,
                                             out int column, out int row, string method, Fraction[,] matrixIn)
        {
            column             = -1;
            row                = -1;
            Fraction[,] matrix = (Fraction[, ])matrixIn.Clone();
            int columns = matrix.GetLength(0);
            int rows    = matrix.GetLength(1);

            Fraction[] supportElementsIndex = new Fraction[columns];
            for (int i = 1; i < columns - 1; i++)
            {
                supportElementsIndex[i] = MAB_SM.FindSupportMinRatio(i, matrix);
            }
            bool flagSupportElem = false;

            for (int y = 0; y < rows && !flagSupportElem; y++)
            {
                for (int x = 0; x < columns; x++)
                {
                    Fraction ratio = matrix[columns - 1, y] / matrix[x, y];
                    if (x != 0 && x != columns - 1 &&
                        y != 0 && y != rows - 1 &&
                        supportElementsIndex[x] != null &&
                        supportElementsIndex[x].IsEquals(ratio) &&
                        matrix[x, y] > 0 &&
                        !flagSupportElem)
                    {
                        switch (method)
                        {
                        case "MAB":
                            if (matrix[0, y] >= lpp.matrix2.GetLength(0))
                            {
                                column          = x;
                                row             = y;
                                flagSupportElem = true;
                            }
                            break;

                        case "SM":
                            column          = x;
                            row             = y;
                            flagSupportElem = true;
                            break;
                        }
                    }
                }
            }
        }
示例#5
0
        public static void Step(LinearProgrammingProblem lpp, int column, int row,
                                string method, int nowNum, List <Fraction[, ]> matrixs)
        {
            int columns = matrixs[nowNum].GetLength(0);
            int rows    = matrixs[nowNum].GetLength(1);

            Fraction[,] matrix = Step_do(lpp, column, row, columns, rows, method);
            switch (method)
            {
            case "MAB":
                Step_deleteColumn(lpp, column, columns, rows, matrix, method);
                break;

            case "SM":
                break;
            }
        }
        private static void NormalizeString(LinearProgrammingProblem lpp,
                                            Fraction[,] matrix, int column, int row)
        {
            Fraction elem = matrix[column, row];

            if (elem.IsEquals(new Fraction(1)))
            {
                return;
            }
            int columns = matrix.GetLength(0);

            for (int j = 1; j < columns; j++)
            {
                matrix[j, row] = matrix[j, row] / elem;
            }
            matrix[0, 0].Text = "№" + (lpp.nowNumMatrixG + 1);
            lpp.methodGauss.Add(CopyMatrix(matrix));
            lpp.nowNumMatrixG++;
        }
示例#7
0
 public MainWindow()
 {
     lpp = new LinearProgrammingProblem();
     InitializeComponent();
     // заполнить comboBoxColumn
     if (comboBoxColumn != null)
     {
         comboBoxColumn.Items.Clear();
         int columns = lpp.maxDimension;
         for (int i = 1; i <= columns; i++)
         {
             comboBoxColumn.Items.Add(i.ToString());
         }
     }
     selectedMethod = "MAB";
     SelectedMethod();
     comboBoxColumn.SelectedIndex = 0;
     comboBoxRow.SelectedIndex    = 0;
 }
示例#8
0
        // calculateButton кнопка перехода к 1 части решения
        private void calculateButton_Click(object sender, RoutedEventArgs e)
        {
            message.Content        = "";
            message2.Content       = "";
            messageAnswer.Content  = "";
            messageAnswer2.Content = "";
            // заполнить массивы с коэф-ми цел. ф-ии и условий
            LinearProgrammingProblem.ReadTextGrid(this, lpp.matrix1, lpp.matrix2, lpp.matrixG, lpp.matrixGFlag);
            // запомнить min или max ищем
            int      columns1 = grid1.ColumnDefinitions.Count;
            ComboBox cB       = (ComboBox)grid1.Children[columns1 - 1];

            lpp.extremum = (string)cB.SelectionBoxItem;
            // проверка ранга
            GaussMethod MatrixsG = new GaussMethod(lpp.matrix2.GetLength(0), lpp.matrix2.GetLength(1), lpp.matrix2);

            if (MatrixsG.Rank == MatrixsG.m)
            {
                // очистить матрицы симпл. метода
                ClearSM();
                // скрыть/ сделать недоступными кнопки навигации
                Display.ChangePropertiesButton_EnabledFalse_1(this);
                Display.ChangePropertiesButton_VisibilityCollapsed_2(this);
                // очистить для новых записей
                ClearMAB();
                ClearG();
                // 1 часть Гаусс/ мет иск. баз.
                switch (selectedMethod)
                {
                case "Gauss":
                    CalculateG();
                    break;

                case "MAB":
                    CalculateMAB();
                    break;
                }
            }
            else
            {
                MessageBox.Show("ошибка: условий больше, чем требуется");
            }
        }
示例#9
0
        public static int getNowNum(LinearProgrammingProblem lpp, string method)
        {
            int nowNum = 0;

            switch (method)
            {
            case "MAB":
                if (lpp.nowNumMatrixMAB % 2 != 0)
                {
                    lpp.nowNumMatrixMAB++;
                }
                nowNum = lpp.nowNumMatrixMAB;
                break;

            case "SM":
                nowNum = lpp.nowNumMatrixSM;
                break;
            }
            return(nowNum);
        }
示例#10
0
        // автоматическое сохранение задачи (в меню пункт menuItemSave),
        // в случае необходимости раскомментировать
        //
        //private void menuItemSave_Click(object sender, RoutedEventArgs e)
        //{
        //    List<string> tasks = SaveTask();
        //    // добавить к имени дату для уникальности
        //    string dateTime = DateTime.Now.ToString("_yyyyMMdd_HHmmss");
        //    // сохранить
        //    File.WriteAllLines((Directory.GetCurrentDirectory() + "/tasks/task" + dateTime + ".txt"), tasks);
        //    MessageBox.Show("Задача сохранена под именем\ntask" + dateTime);
        //}


        // для сохранения задачи
        private List <string> SaveTask()
        {
            List <string> tasks = new List <string>();

            Fraction[,] matrix1Save;
            Fraction[,] matrix2Save;
            Fraction[,] matrixGSave;
            bool[,] matrixGFlagSave;
            String extremumSave = "";

            // размер матрицы
            int m1rows    = 1;
            int m1columns = 1;
            int m2rows    = 1;
            int m2columns = 1;

            if (comboBoxColumn != null)
            {
                m2columns = comboBoxColumn.SelectedIndex + 2;
                m1columns = m2columns;
            }
            if (comboBoxRow != null)
            {
                m2rows = comboBoxRow.SelectedIndex + 1;
            }
            // создать матрицу
            matrix1Save     = new Fraction[m1columns, m1rows];
            matrix2Save     = new Fraction[m2columns, m2rows];
            matrixGSave     = new Fraction[m1columns, m1rows];
            matrixGFlagSave = new bool[m1columns, m1rows];
            // заполнить массивы с коэф-ми цел. ф-ии и условий
            LinearProgrammingProblem.ReadTextGrid(this, matrix1Save, matrix2Save, matrixGSave, matrixGFlagSave);
            // запомнить min или max ищем
            int      columns1 = grid1.ColumnDefinitions.Count;
            ComboBox cB       = (ComboBox)grid1.Children[columns1 - 1];

            extremumSave = (string)cB.SelectionBoxItem;
            // заполнить список строк задачи
            FullTasks(tasks, matrix1Save, matrix2Save, matrixGSave, extremumSave, m1rows, m1columns, m2rows, m2columns);
            return(tasks);
        }
        public static void TransformMatrix(LinearProgrammingProblem lpp,
                                           Fraction[,] matrixBasis, bool[,] matrixFlag, List <Fraction[, ]> matrixs, Label mes)
        {
            Fraction[,] matrix = CopyMatrix(matrixs[matrixs.Count - 1]);
            int columns = matrix.GetLength(0);
            int rows    = matrix.GetLength(1);
            int count   = 1;
            int countM  = lpp.matrix2.GetLength(1);

            // проверка коол-ва условий и кол-ва баз. переменных
            for (int i = 1; i < columns - 1; i++)
            {
                if (matrixFlag[i - 1, 0])
                {
                    if (count > countM)
                    {
                        mes.Content = "Количество условий и базисных переменных не совпадает (много)";
                        return;
                    }
                    count++;
                }
            }
            count--;
            if (count != countM)
            {
                mes.Content = "Количество условий и базисных переменных не совпадает (мало)";
                return;
            }
            // метод гаусса
            count = 1;
            // двежение слева направо
            for (int i = 1; i < columns - 1; i++)
            {
                if (matrixFlag[i - 1, 0])
                {
                    if (matrix[i, count].IsEquals(new Fraction(0)))
                    {
                        for (int k = count + 1; k <= rows && matrix[i, count].IsEquals(new Fraction(0)); k++)
                        {
                            if (k == rows)
                            {
                                mes.Content = "Базис не совпал. Выразить через базисные переменные не удалось";
                                return;
                            }
                            SwapRows2(matrix, count, k);
                            matrix[0, 0].Text = "№" + (lpp.nowNumMatrixG + 1);
                            lpp.methodGauss.Add(CopyMatrix(matrix));
                            lpp.nowNumMatrixG++;
                        }
                    }
                    // нормирование строки
                    NormalizeString(lpp, matrix, i, count);
                    // обнуление столбца снизу под баз. эл.
                    TransformMatrixColumnPart1(lpp, matrix, i, count, mes);
                    count++;
                }
            }
            count--;
            // движение справа налево
            for (int i = columns - 2; i >= 1; i--)
            {
                if (matrixFlag[i - 1, 0])
                {
                    // обнуление столбца сверху над баз.эл.
                    TransformMatrixColumnPart2(lpp, matrix, i, count, mes);
                    count--;
                }
            }

            int n = lpp.matrix2.GetLength(0);

            Fraction[] arr = new Fraction[n];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = new Fraction(0);
            }
            // проверка на совпадение введенного базиса и полученного
            countM = 1;
            for (int i = 1; i < columns - 1; i++)
            {
                if (matrixFlag[i - 1, 0])
                {
                    if (!matrixBasis[i - 1, 0].IsEquals(matrix[columns - 1, countM]))
                    {
                        mes.Content = "Базис не совпал";
                        return;
                    }
                    countM++;
                }
            }
        }
示例#12
0
        private static Fraction[,] Step_do(LinearProgrammingProblem lpp,
                                           int column, int row, int columns, int rows, string method)
        {
            int nowNum = -1;
            List <Fraction[, ]> matrixs = new List <Fraction[, ]>();

            switch (method)
            {
            case "MAB":
                nowNum  = lpp.nowNumMatrixMAB;
                matrixs = lpp.methodOfArtificialBasis;
                break;

            case "SM":
                nowNum  = lpp.nowNumMatrixSM;
                matrixs = lpp.simplexMethod;
                break;
            }
            Fraction[,] matrix          = new Fraction[columns, rows];
            matrix[0, 0]                = new Fraction();
            matrix[0, 0].Text           = "№" + (nowNum + 1);
            matrix[0, rows - 1]         = new Fraction();
            matrix[0, rows - 1].Text    = " ";
            matrix[columns - 1, 0]      = new Fraction();
            matrix[columns - 1, 0].Text = " ";

            for (int i = 1; i < columns - 1; i++)
            {
                matrix[i, 0] = new Fraction();
                matrix[i, 0] = matrixs[nowNum][i, 0];
            }
            for (int i = 1; i < rows - 1; i++)
            {
                matrix[0, i] = new Fraction();
                matrix[0, i] = matrixs[nowNum][0, i];
            }
            matrix[column, 0] = matrixs[nowNum][0, row];
            matrix[0, row]    = matrixs[nowNum][column, 0];
            Fraction fr1 = new Fraction(1);

            // опорный элемент
            matrix[column, row]           = fr1 / matrixs[nowNum][column, row];
            matrix[column, row].IsSupport = true;
            // строки
            for (int i = 1; i < columns; i++)
            {
                if (i != column)
                {
                    matrix[i, row] = matrixs[nowNum][i, row] * matrix[column, row];
                }
            }
            // столбцы
            for (int i = 1; i < rows; i++)
            {
                if (i != row)
                {
                    matrix[column, i] = (-1) * matrixs[nowNum][column, i] * matrix[column, row];
                }
            }
            // остальное
            for (int i = 1; i < rows; i++)
            {
                for (int j = 1; j < columns; j++)
                {
                    if (i != row && j != column)
                    {
                        matrix[j, i] = matrixs[nowNum][j, i] - matrixs[nowNum][column, i] * matrix[j, row];
                    }
                }
            }
            switch (method)
            {
            case "MAB":
                lpp.methodOfArtificialBasis.Add(matrix);
                lpp.nowNumMatrixMAB++;
                break;

            case "SM":
                lpp.simplexMethod.Add(matrix);
                lpp.nowNumMatrixSM++;
                break;
            }
            return(matrix);
        }