Beispiel #1
0
 /// <summary>
 /// Создание первой таблицы
 /// </summary>
 public List <List <SimpleFractions> > CreateTable(MatrixFractions matrix, List <int> basis, List <SimpleFractions> F)
 {
     try
     {
         List <List <SimpleFractions> > list = new List <List <SimpleFractions> >();
         for (int i = 0; i < matrix.N; i++)
         {
             list.Add(new List <SimpleFractions>());
             list.LastOrDefault().Add(matrix.Matrix[i, matrix.M - 1]);
             for (int j = 0; j < matrix.M - 1; j++)
             {
                 list.LastOrDefault().Add(matrix.Matrix[i, j]);
             }
         }
         list.Add(new List <SimpleFractions>());
         for (int j = 0; j < matrix.M; j++)
         {
             SimpleFractions fractions;
             fractions = sFM.Multiplication(list[0][j], F[0]);
             for (int i = 1; i < matrix.N; i++)
             {
                 fractions = sFM.Sum(sFM.Multiplication(list[i][j], F[i]), fractions);
             }
             if (j != 0)
             {
                 fractions = sFM.Difference(fractions, F[j - 1]);
             }
             else
             {
                 fractions = sFM.Difference(fractions, F[F.Count - 1]);
             }
             list.LastOrDefault().Add(fractions);
         }
         return(list);
     }
     catch (Exception e)
     {
         return(null);
     }
 }
        private List <SimpleFractions> ListAnswer(MatrixFractions matrix, List <int> kombi)
        {
            List <SimpleFractions> answerList = new List <SimpleFractions>();

            for (int k = 0; k < kombi.Count; k++)
            {
                if (kombi[k] == 1)
                {
                    for (int i = 0; i < matrix.N; i++)
                    {
                        if (matrix.Matrix[i, k].Numerator == matrix.Matrix[i, k].Denominator)
                        {
                            answerList.Add(matrix.Matrix[i, matrix.M - 1]);
                        }
                    }
                }
                else
                {
                    answerList.Add(null);
                }
            }
            return(answerList);
        }
        /// <summary>
        /// Упрощение матрицы
        /// </summary>
        public bool Norm(MatrixFractions matrix)
        {
            bool flag = false;
            SimpleFractionsMeneger sFM  = new SimpleFractionsMeneger();
            List <int>             list = new List <int>();

            for (int i = 0; i < matrix.N; i++)
            {
                //числитель
                int coutOtr = 0;
                for (int j = 0; j < matrix.M; j++)
                {
                    matrix.Matrix[i, j] = sFM.Norm(matrix.Matrix[i, j]);
                    list.Add(Math.Abs(matrix.Matrix[i, j].Numerator));
                    if (matrix.Matrix[i, j].Numerator < 0)
                    {
                        coutOtr++;
                    }
                }
                list.RemoveAll(a => a == 0);
                int nod = sFM.NOD(list);
                if (nod == 0)
                {
                    nod = -1;
                }
                else if (coutOtr == list.Count)
                {
                    nod *= -1;
                }
                if (nod != 1)
                {
                    for (int j = 0; j < matrix.M; j++)
                    {
                        matrix.Matrix[i, j].Numerator /= nod;
                        flag = true;
                    }
                }
                list.Clear();
                //знаменатель
                for (int j = 0; j < matrix.M; j++)
                {
                    matrix.Matrix[i, j] = sFM.Norm(matrix.Matrix[i, j]);
                    if (matrix.Matrix[i, j].Numerator != 0)
                    {
                        list.Add(matrix.Matrix[i, j].Denominator);
                    }
                }
                //list.RemoveAll(a => a == 0);
                nod = sFM.NOD(list);
                if (nod == 0)
                {
                    break;
                }
                if (nod != 1)
                {
                    for (int j = 0; j < matrix.M; j++)
                    {
                        matrix.Matrix[i, j].Denominator /= nod;
                        flag = true;
                    }
                }
                list.Clear();
            }
            return(flag);
        }
Beispiel #4
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);
        }
Beispiel #5
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;
        }