/// <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; }
/// <summary> /// Makes cutoff /// </summary> public new KeyValuePair<Fraction[], Fraction> MakeCutoff(SimplexTable table, string creativeVar, ProblemForGomory problem) { var j = 0; var creativeRow = table.GetRow(creativeVar); var row = new Fraction[creativeRow.Key.Length + 1]; foreach (var variable in table.Variables) row[j++] = GetCoefficientForCutoff(variable, table, creativeVar, problem.WholeConstraints) * -1; row[j] = new Fraction(1, 1); return new KeyValuePair<Fraction[], Fraction>(row, GetFractionalPart(creativeRow.Value) * -1); }
private Fraction GetCoefficientForCutoff(string variable, SimplexTable table, string creativeVar, ICollection<string> wholeConstraints) { var varIndex = table.IndexOf(variable); var creativeRow = table.GetRow(creativeVar); var varCoefFractionalPart = GetFractionalPart(creativeRow.Key[varIndex]); var freeCoefFractionalPart = GetFractionalPart(creativeRow.Value); if (wholeConstraints.Contains(variable)) return (varCoefFractionalPart <= freeCoefFractionalPart) ? varCoefFractionalPart : freeCoefFractionalPart / (1 - freeCoefFractionalPart) * (1 - varCoefFractionalPart); return (creativeRow.Key[varIndex] >= 0) ? creativeRow.Key[varIndex] : freeCoefFractionalPart / (1 - freeCoefFractionalPart) * (-1 * varCoefFractionalPart); }
/// <summary> /// Makes cutoff /// </summary> public KeyValuePair<Fraction[], Fraction> MakeCutoff(SimplexTable table, string creativeVar, ProblemForGomory problem) { var j = 0; var creativeRow = table.GetRow(creativeVar); var row = new Fraction[creativeRow.Key.Length + 1]; foreach (var coefficient in creativeRow.Key) row[j++] = GetFractionalPart(coefficient) * -1; row[j] = new Fraction(1, 1); return new KeyValuePair<Fraction[], Fraction>(row, GetFractionalPart(creativeRow.Value) * -1); }
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; }