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