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