Beispiel #1
0
 public LinearSolver(LinearConstraint[] LCs, Objective objective)
 {
     originConstraints = LCs;
     this.objective    = objective;
     toSearch          = new Heap <Node>(50);
     globalLowerBound  = 0;
 }
Beispiel #2
0
        public static bool IsSqrt(BigInteger value, BigInteger root)
        {
            var number = new Rationals.Rational(value);
            var power  = Rationals.Rational.Pow(new Rationals.Rational(root), 2);

            return(number.CompareTo(power) == 0);
        }
Beispiel #3
0
        public static bool IsSqrtXxx(BigInteger value, BigInteger root)
        {
            var number     = new Rationals.Rational(value);
            var lowerBound = Rationals.Rational.Pow(new Rationals.Rational(root), 2);
            var upperBound = Rationals.Rational.Pow(Rationals.Rational.Add(new Rationals.Rational(root), 1), 2);

            return(lowerBound.CompareTo(number) <= 0 &&
                   number.CompareTo(upperBound) < 0);
        }
Beispiel #4
0
 public Rational(Rationals.Rational rational)
 {
     Fraction = rational;
 }
Beispiel #5
0
 public Rational(BigInteger numerator, BigInteger denominator)
 {
     Fraction = new Rationals.Rational(numerator, denominator);
 }
Beispiel #6
0
 public Rational(BigInteger number)
 {
     Fraction = new Rationals.Rational(number, 0);
 }
Beispiel #7
0
        // Unterteilt das jetzige Ergebnic c in Unterzweigen
        // Fuer die Variablen, die nicht ganzzahlig sind
        private void SolveOne(Node c, CancellationToken cancelToken)
        {
            if (cancelToken.IsCancellationRequested)
            {
                IsCompleted = false;
                return;
            }
            if (!c.IsInfeasible)
            {
                // Falls das jetzige Ergebis schlechter als die Untergrenze,
                // dann muss es nicht in Unterzweigen mehr geteilt werden
                if (globalLowerBound > c.Upperbound)
                {
                    return;
                }
                // Falls das Lowerbound des jetizgen Ergebnises besser
                // als das Gespeicherte, dann ersetz das Gespeicherte
                // durch das Jetzige
                if (globalLowerBound < c.Lowerbound)
                {
                    globalLowerBound = c.Lowerbound;
                    // Und update das jetizge beste Loesung
                    CurrentSolution = new Dictionary <string, rat>();
                    foreach (var kvp in c.Answer)
                    {
                        CurrentSolution.Add(kvp.Key, kvp.Value.WholePart);
                        CurrentSolution["P"] = c.Lowerbound;
                    }
                }

                // Falls eine ganzzahlige Loesung (alle Variablen ganzzahlig) gefunden
                // dann kann man die ganze Suchreihe loeschen
                // denn dort wird die Ergebnis nach Upperbound sortiert
                // d.h. dieses Ergebnis 'c' hat den hoechstwahrscheinlichen Wert
                // innerhalb aller Moeglichkeiten
                if (c.Lowerbound.Equal(c.Upperbound))
                {
                    toSearch.Clear();
                    // Die endgueltige Loesung
                    BestSolution = new Dictionary <string, rat>();
                    foreach (var kvp in c.Answer)
                    {
                        BestSolution.Add(kvp.Key, kvp.Value.CanonicalForm);
                    }
                    return;
                }

                // Falls das jetizge Ergebnis nicht-ganzzahlige Variablen enthaelt
                // werden jede nicht-ganzzahlige Variable in zwei Zweigen unterteilt
                // naemlich x_i = 0 oder x_i = 1
                foreach (var pair in c.Answer)
                {
                    // der Zielwert 'P' kann uebersprungen werden
                    if (pair.Key.Equals(objective.LHSVariableNames[0]))
                    {
                        continue;
                    }
                    if (!(pair.Value.FractionPart == 0))
                    {
                        LinearConstraint zero = new LinearConstraint(new string[] { pair.Key }, new rat[] { 1 }, 0, LinearConstraint.InequalityType.SmallerOrEqualTo);
                        toSearch.Add(new Node(c.Tableau, zero, objective, cancelToken));
                        LinearConstraint one = new LinearConstraint(new string[] { pair.Key }, new rat[] { -1 }, -1, LinearConstraint.InequalityType.SmallerOrEqualTo);
                        toSearch.Add(new Node(c.Tableau, one, objective, cancelToken));
                    }
                }
            }
        }
Beispiel #8
0
 public static Rational CreateRational(Rationals.Rational value)
 {
     return(new Rational(value));
 }