/// <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); }
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); }
/// <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; }