Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
 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);
 }
Esempio n. 4
0
        /// <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;
 }