/// <summary>
        /// Метод прямоугольников для SimplexMethod
        /// </summary>
        private bool Rectangle(MatrixFractions matrix, List <int> basis)
        {
            List <Tuple <int, int> > obmen = new List <Tuple <int, int> >();
            int minus = 2;

            for (int b = 0; b < basis.Count; b++)
            {
                if (basis[b] == 1)
                {
                    continue;
                }
                if (b > matrix.M)
                {
                    if (Notify != null)
                    {
                        Notify($"Ошибочные данные в базисе\n");
                    }
                    return(false);
                }
                obmen.Add(new Tuple <int, int>(b, matrix.M - 2));
                ObmenColumn(matrix, b, matrix.M - minus, true);
                minus++;
            }
            if (Notify != null)
            {
                Notify($"Оптимизация для метода прямоугольников:\n{matrix.toString()}\n");
            }
            Rectangle rectangle = new Rectangle();

            rectangle.Notify += Message;
            var flag = rectangle.RectangleMetod(matrix);

            if (!flag)
            {
                if (Notify != null)
                {
                    Notify($"Ошибка в методе прямоугольников\n");
                }
                return(false);
            }
            foreach (var o in obmen)
            {
                ObmenColumn(matrix, o.Item1, o.Item2, false);
            }
            if (Notify != null)
            {
                Notify($"Обмен столбцов обратно:\n{matrix.toString()}\n");
            }
            return(true);
        }
示例#2
0
        public bool RectangleMetod(MatrixFractions matrix)
        {
            List <int> banIndexStrList = new List <int>();

            if (matrix.M < matrix.N)
            {
                if (Notify != null)
                {
                    Notify($"Строк больше столбцов! Невозможно решить! (Код 1.0)\n");
                }
                return(false);
            }
            for (int nowStr = 0, nowCol = 0; nowStr < matrix.N || nowCol < matrix.N; nowStr++, nowCol++)
            {
                if (_mFM.Norm(matrix))
                {
                    if (Notify != null)
                    {
                        Notify("Сокращение:\n" + matrix.toString() + "\n");
                    }
                }
                //блок проверки
                var check = CheckExceptions(matrix);
                if (check == null)
                {
                    if (Notify != null)
                    {
                        Notify($"Ошибка! \n");
                    }
                    return(false);
                }
                if (check.SingleOrDefault() == -1)
                {
                    if (Notify != null)
                    {
                        Notify($"Противоречие! \n");
                    }
                    return(false);
                }
                if (check.Count > 0)
                {
                    foreach (var ch in check)
                    {
                        banIndexStrList.Add(ch);
                    }
                }
                if (Notify != null)
                {
                    Notify($"Пока что все идет по плану... наверное! \n");
                }
                //проверка банлиста
                int strNullCount = CheckBanlist(check, nowStr, matrix.N);
                if (strNullCount > 0)
                {
                    nowStr += strNullCount - 1;
                    if (nowStr >= matrix.N)
                    {
                        if (Notify != null)
                        {
                            Notify("Зануленная строка!\n" + matrix.toString() + "\n");
                        }
                    }
                }
                if (nowStr >= matrix.N)
                {
                    return(true);
                }
                //проверка на 0-вой элемент
                if (matrix.Matrix[nowStr, nowCol].Numerator == 0)
                {
                    int Str = nowStr;
                    Str++;
                    if (Str >= matrix.N)
                    {
                        if (Notify != null)
                        {
                            Notify($"Ведущий элемент 0, а строки закончились. Упс... \n");
                        }
                        return(true);
                    }
                    while (matrix.Matrix[Str, nowCol].Numerator == 0)
                    {
                        Str++;
                        if (Str >= matrix.N)
                        {
                            if (Notify != null)
                            {
                                Notify($"Ведущий элемент 0, а строки закончились. Упс... \n");
                            }
                            return(true);
                        }
                    }
                    ObmenStrok(matrix, Str, nowStr);
                    if (Notify != null)
                    {
                        Notify($"Обмен: ({nowStr} и {Str})\n"); Notify(matrix.toString() + "\n");
                    }
                }
                //приводим к 1
                if (matrix.Matrix[nowStr, nowCol].Numerator != matrix.Matrix[nowStr, nowCol].Denominator)
                {
                    SimpleFractions kof = matrix.Matrix[nowStr, nowCol];
                    for (int j1 = 0; j1 < matrix.M; j1++)
                    {
                        matrix.Matrix[nowStr, j1] = _sFM.Division(matrix.Matrix[nowStr, j1], kof);
                    }
                    if (Notify != null)
                    {
                        Notify($"Приведение: ({nowStr + 1}) : {kof.toString()} \n"); Notify(matrix.toString() + "\n");
                    }
                }
                //прямоугольники
                for (int j1 = nowStr + 1; j1 < matrix.M; j1++)
                {
                    for (int i1 = 0; i1 < matrix.N; i1++)
                    {
                        if (i1 != nowCol)
                        {
                            matrix.Matrix[i1, j1] =
                                _sFM.Difference(matrix.Matrix[i1, j1],
                                                _sFM.Multiplication(matrix.Matrix[nowStr, j1], matrix.Matrix[i1, nowCol]));
                        }
                    }
                }
                for (int i = 0; i < matrix.N; i++)
                {
                    if (i != nowStr)
                    {
                        matrix.Matrix[i, nowCol].Denominator = 1;
                        matrix.Matrix[i, nowCol].Numerator   = 0;
                    }
                }
                if (Notify != null)
                {
                    Notify("После прямоугольников: \n" + matrix.toString() + "\n");
                }
            }
            return(true);
        }
示例#3
0
        /// <summary>
        /// Метод прямоугольников для SimplexMethod
        /// </summary>
        private bool Rectangle(MatrixFractions matrix, List <int> basis)
        {
            List <Tuple <int, int> > obmen = new List <Tuple <int, int> >();
            int minus = 0;
            int x;

            for (int j = 0; j < basis.Count; j++)
            {
                var b = basis[j];
                if (b > matrix.M)
                {
                    if (Notify != null)
                    {
                        Notify($"Ошибочные данные в базисе\n");
                    }
                    return(false);
                }
                obmen.Add(new Tuple <int, int>(b, matrix.M - 2));
                ObmenColumn(matrix, b, minus, true);
                minus++;
            }
            if (Notify != null)
            {
                Notify($"Оптимизация для метода прямоугольников:\n{matrix.toString()}\n");
            }
            Rectangle rectangle = new Rectangle();

            rectangle.Notify += Message;
            var flag = rectangle.RectangleMetod(matrix);

            if (!flag)
            {
                if (Notify != null)
                {
                    Notify($"Ошибка в методе прямоугольников\n");
                }
                return(false);
            }
            foreach (var o in obmen)
            {
                ObmenColumn(matrix, o.Item1, o.Item2, false);
            }
            if (Notify != null)
            {
                Notify($"Обмен столбцов обратно:\n{matrix.toString()}\n");
            }
            return(true);
            //List<Tuple<int, int>> obmen = new List<Tuple<int, int>>();
            //int numStr = 0;
            //basis.Sort();
            //foreach (var b in basis)
            //{
            //    if (b > matrix.M) { if (Notify != null) Notify($"Ошибочные данные в базисе\n"); return false; }
            //    if (numStr == b)
            //    {
            //        numStr++; continue;
            //    }
            //    obmen.Add(new Tuple<int, int>(numStr, b));
            //    ObmenColumn(matrix, numStr, b, true);
            //    numStr++;
            //}
            //if (Notify != null) Notify($"Оптимизация для метода прямоугольников:\n{matrix.toString()}\n");
            //Rectangle rectangle = new Rectangle();
            //rectangle.Notify += Message;
            //var flag = rectangle.RectangleMetod(matrix);
            //if (!flag) { if (Notify != null) Notify($"Ошибка в методе прямоугольников\n"); return false; }
            //foreach (var o in obmen)
            //{
            //    ObmenColumn(matrix, o.Item1, o.Item2, false);
            //}
            //if (Notify != null) Notify($"Обмен столбцов обратно:\n{matrix.toString()}\n");
            //return true;
        }