private bool HavePositiveCellsWithoutPositiveElements(SimplexTable table) { for (var j = 0; j < table.Variables.Count; j++) { if (table.GetRating(table.Variables.ElementAt(j)) <= 0) continue; var havePositive = false; for (var i = 0; i < table.RowsCount; i++) { if (table.GetMatrixElement(i, j) < 0) continue; havePositive = true; break; } if (!havePositive) return true; } return false; }
/// <summary> /// Returns index of solving cell(or -1 if table has no positive rating) /// </summary> /// <param name="table">Table with calculated ratings</param> /// <param name="solvingRowIndex">Index of solving row</param> private int GetSolvingCellIndex(SimplexTable table, int solvingRowIndex) { if (solvingRowIndex < 0) return -1; var minRatioIndex = -1; var minRatio = new MaxCoefficient(); for (var i = 0; i < table.Variables.Count; i++) { var matrixElement = table.GetMatrixElement(solvingRowIndex, i); if (matrixElement >= 0) continue; var rating = table.Ratings[i]; var currRatio = new MaxCoefficient(rating); currRatio.Multiply(1 / matrixElement); if (currRatio.CompareTo(minRatio) != -1 && minRatioIndex != -1) continue; minRatioIndex = i; minRatio = currRatio; } return minRatioIndex; }
/// <summary> /// Returns index of solving row(or -1 if solving row has no positive elements or solvingCellIndex == -1) /// </summary> private int GetSolvingRowIndex(SimplexTable table, int solvingCellIndex) { if (solvingCellIndex < 0) return -1; var minRatioIndex = -1; var minRatio = new Fraction(); for (var i = 0; i < table.RowsCount; i++) { var matrixElement = table.GetMatrixElement(i, solvingCellIndex); if (matrixElement <= 0) continue; var freeCoefficient = table.GetFreeCoefficient(i); var currRatio = freeCoefficient / matrixElement; if (currRatio >= minRatio && minRatioIndex != -1) continue; minRatioIndex = i; minRatio = currRatio; } return minRatioIndex; }
/// <summary> /// Gets result of solving of normalized problem /// </summary> public LppResult GetNormalizedProblemResult(SimplexTable table) { for (var i = 0; i < table.Variables.Count; i++) { if (table.GetRating(table.Variables.ElementAt(i)) <= 0) continue; var allNegative = true; for (var j = 0; j < table.RowsCount; j++) { if (table.GetMatrixElement(j, i) >= 0) allNegative = false; } if (allNegative) return new LppResult(null, null); } return GetResult(table, VariablesWithMaxCoefficient); }