/// <summary> /// Gets variable, which indicates creative row /// </summary> public string GetCreativeVariable(SimplexTable table, ProblemForGomory problem) { var maxVariables = new List<string>(); var maxFractionalPart = new Fraction(); foreach (var basisVariable in table.GetBasis()) { if (!problem.WholeConstraints.Contains(basisVariable.Key)) continue; var fractionalPart = GetFractionalPart(basisVariable.Value); if (fractionalPart > maxFractionalPart) { maxVariables.Clear(); maxFractionalPart = fractionalPart; } if (fractionalPart == maxFractionalPart) maxVariables.Add(basisVariable.Key); } if (maxVariables.Count == 1) return maxVariables[0]; maxFractionalPart = new Fraction(); var maxVariable = string.Empty; foreach (var variable in maxVariables) { var sumOfFractionalParts = new Fraction(); foreach (var rowVariable in table.GetRow(variable).Key) sumOfFractionalParts += GetFractionalPart(rowVariable); var ratio = sumOfFractionalParts != 0 ? GetFractionalPart(table.GetRow(variable).Value) / sumOfFractionalParts : new Fraction(); if (ratio <= maxFractionalPart) continue; maxFractionalPart = ratio; maxVariable = variable; } return maxVariable; }
private bool HaveNegativeFreeCoefficients(SimplexTable table) { foreach (var coefficient in table.GetBasis().Values) if (coefficient < 0) return true; return false; }
private bool HaveNegativeRowsWithoutNegativeElements(SimplexTable table) { foreach (var basisVar in table.GetBasis()) { if (basisVar.Value >= 0) continue; var haveNegative = false; foreach (var tableElement in table.GetRow(basisVar.Key).Key) { if (tableElement >= 0) continue; haveNegative = true; break; } if (!haveNegative) return true; } return false; }
private static LppResult GetResult(SimplexTable table, ICollection<string> varsWithMaxCoefficient) { var point = new Dictionary<string, Fraction>(); var basis = table.GetBasis(); var isCorrect = true; foreach (var variable in table.Variables) { if (varsWithMaxCoefficient.Contains(variable) && basis.ContainsKey(variable) && basis[variable] != 0) isCorrect = false; point.Add(variable, (basis.ContainsKey(variable) ? basis[variable] : new Fraction())); } return new LppResult(point, isCorrect ? table.CalculateFunctionValue().FreeCoefficient : null); }