public LinearSolver(LinearConstraint[] LCs, Objective objective) { originConstraints = LCs; this.objective = objective; toSearch = new Heap <Node>(50); globalLowerBound = 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); }
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); }
public Rational(Rationals.Rational rational) { Fraction = rational; }
public Rational(BigInteger numerator, BigInteger denominator) { Fraction = new Rationals.Rational(numerator, denominator); }
public Rational(BigInteger number) { Fraction = new Rationals.Rational(number, 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)); } } } }
public static Rational CreateRational(Rationals.Rational value) { return(new Rational(value)); }