/// <summary> /// Permite fazer a leitura de um vector a partir de texto. /// </summary> /// <param name="lines">O tamanho do vector.</param> /// <param name="vectorString">O texto que representa o vector.</param> /// <returns>O vector.</returns> public IMathVector <double> ReadVector(int length, string vectorString) { var integerParser = new DoubleExpressionParser(); var vectorFactory = new ArrayVectorFactory <double>(); var reader = new StringReader(vectorString); var stringSymbolReader = new StringSymbolReader(reader, false); var vectorReader = new ConfigVectorReader <double, string, string, CharSymbolReader <string> >( length, vectorFactory); vectorReader.MapInternalDelimiters("left_bracket", "right_bracket"); vectorReader.AddBlanckSymbolType("blancks"); vectorReader.SeparatorSymbType = "comma"; var vector = default(IMathVector <double>); if (vectorReader.TryParseVector(stringSymbolReader, integerParser, out vector)) { return(vector); } else { throw new Exception("An error has occured while reading integer vector."); } }
public void SubsetSumLLLReductionAlgorithmConstructorTest() { var integerDomain = new IntegerDomain(); var decimalField = new DecimalField(); var vectorFactory = new ArrayVectorFactory <decimal>(); var decimalComparer = Comparer <decimal> .Default; var nearest = new DecimalNearestInteger(); // Permite calcular o produto escalar de vectores sobre o corpo de decimais. var scalarProd = new OrthoVectorScalarProduct <decimal>( decimalComparer, decimalField); // Permite converter um número decimal num inteiro, caso seja possível. var integerDecimalConverter = new IntegerDecimalConverter(); var subsetSumAlg = new SubsetSumLLLReductionAlgorithm <int, decimal>( vectorFactory, scalarProd, nearest, Comparer <decimal> .Default, integerDecimalConverter, decimalField); var vector = new[] { 366, 385, 392, 401, 422, 437 }; var result = subsetSumAlg.Run(vector, 1215, 3M / 4); var expected = new[] { 392, 401, 422 }; CollectionAssert.AreEquivalent(expected, result); }
public void RunTest_OneEquality() { var inputConstraintsMatrixText = "[[1,0,3],[0,2,2]]"; var inputConstraintsVectorText = "[4,12,18]"; var cost = new SimplexMaximumNumberField <double>(0, -18); var nonBasicVariables = new[] { 0, 1 }; var basicVariables = new[] { 2, 3, 4 }; // Leitura da matriz das retrições. var doubleElementsParser = new DoubleParser <string>(); var inputConstraintsMatrix = TestsHelper.ReadMatrix <double>( 3, 2, inputConstraintsMatrixText, (i, j) => new ArrayMathMatrix <double>(i, j), doubleElementsParser, true); // Leitura do vector de restrições. var vectorFactory = new ArrayVectorFactory <double>(); var inputConstraintsVector = TestsHelper.ReadVector <double>( 3, inputConstraintsVectorText, vectorFactory, doubleElementsParser, true); // Introdução da função objectivo. var inputObjectiveFunction = new ArrayMathVector <SimplexMaximumNumberField <double> >(2); inputObjectiveFunction[0] = new SimplexMaximumNumberField <double>( -3, -3); inputObjectiveFunction[1] = new SimplexMaximumNumberField <double>( -5, -2); // Objecto de entrada para o algoritmo do simplex. var simplexInput = new SimplexInput <double, SimplexMaximumNumberField <double> >( basicVariables, nonBasicVariables, inputObjectiveFunction, cost, inputConstraintsMatrix, inputConstraintsVector); var doubleField = new DoubleField(); var target = new SimplexAlgorithm <double>(Comparer <double> .Default, doubleField); var actual = target.Run(simplexInput); // Verifica o custo Assert.AreEqual(36, actual.Cost); // Verifica a solução Assert.AreEqual(2, actual.Solution[0]); Assert.AreEqual(6, actual.Solution[1]); }
public void RunSimplexTest_NoFeasibleSolution() { var inputConstraintsMatrixText = "[[0.3,0.5,0.6],[0.1,0.5,0.4],[0,0,-1]]"; var inputConstraintsVectorText = "[1.8,6,6]"; var cost = new SimplexMaximumNumberField <double>(0, -12); var nonBasicVariables = new[] { 0, 1, 2 }; var basicVariables = new[] { 3, 4, 5 }; // Leitura da matriz das retrições. var doubleElementsParser = new DoubleParser <string>(); var inputConstraintsMatrix = TestsHelper.ReadMatrix <double>( 3, 3, inputConstraintsMatrixText, (i, j) => new ArrayMathMatrix <double>(i, j), doubleElementsParser, true); // Leitura do vector de restrições. var vectorFactory = new ArrayVectorFactory <double>(); var inputConstraintsVector = TestsHelper.ReadVector <double>( 3, inputConstraintsVectorText, vectorFactory, doubleElementsParser, true); // Introdução da função objectivo. var inputObjectiveFunction = new ArrayMathVector <SimplexMaximumNumberField <double> >(3); inputObjectiveFunction[0] = new SimplexMaximumNumberField <double>( 0.4, -1.1); inputObjectiveFunction[1] = new SimplexMaximumNumberField <double>( 0.5, -0.9); inputObjectiveFunction[2] = new SimplexMaximumNumberField <double>( 0, 1); // Objecto de entrada para o algoritmo do simplex. var simplexInput = new SimplexInput <double, SimplexMaximumNumberField <double> >( basicVariables, nonBasicVariables, inputObjectiveFunction, cost, inputConstraintsMatrix, inputConstraintsVector); var doubleField = new DoubleField(); var target = new SimplexAlgorithm <double>(Comparer <double> .Default, doubleField); var actual = target.Run(simplexInput); // O problema tem uma solução cujo custo é inifito. Assert.IsFalse(actual.HasSolution); }
public void RunTest2() { var integerDomain = new IntegerDomain(); var decimalField = new DecimalField(); var vectorFactory = new ArrayVectorFactory <decimal>(); var decimalComparer = Comparer <decimal> .Default; var nearest = new DecimalNearestInteger(); var scalarProd = new OrthoVectorScalarProduct <decimal>( decimalComparer, decimalField); var integerDecimalConverter = new IntegerDecimalConverter(); var dim = 4; var vectorSet = new IMathVector <decimal> [dim]; var lllReductionAlg = new LLLBasisReductionAlgorithm <IMathVector <decimal>, decimal, int>( new VectorSpace <decimal>(dim, vectorFactory, decimalField), scalarProd, nearest, Comparer <decimal> .Default); vectorSet[0] = new ArrayMathVector <decimal>(new decimal[] { 1, 1, 7, 2 }); vectorSet[1] = new ArrayMathVector <decimal>(new decimal[] { 9, 8, 4, 6 }); vectorSet[2] = new ArrayMathVector <decimal>(new decimal[] { 1, 8, 5, 7 }); vectorSet[3] = new ArrayMathVector <decimal>(new decimal[] { 2, 3, 1, 1 }); var reduced = lllReductionAlg.Run(vectorSet, 3M / 4); var expected = new IMathVector <decimal> [dim]; expected[0] = new ArrayMathVector <decimal>(new decimal[] { 2, 3, 1, 1 }); expected[1] = new ArrayMathVector <decimal>(new decimal[] { 3, -1, 1, 3 }); expected[2] = new ArrayMathVector <decimal>(new decimal[] { -2, 2, 6, -1 }); expected[3] = new ArrayMathVector <decimal>(new decimal[] { -4, 1, -4, 3 }); this.AsserVectorLists(expected, reduced); }
public void RunTest1() { var integerDomain = new IntegerDomain(); var decimalField = new DecimalField(); var vectorFactory = new ArrayVectorFactory <decimal>(); var decimalComparer = Comparer <decimal> .Default; var nearest = new DecimalNearestInteger(); var scalarProd = new OrthoVectorScalarProduct <decimal>( decimalComparer, decimalField); var integerDecimalConverter = new IntegerDecimalConverter(); var lllReductionAlg = new LLLBasisReductionAlgorithm <IMathVector <decimal>, decimal, int>( new VectorSpace <decimal>(3, vectorFactory, decimalField), scalarProd, nearest, Comparer <decimal> .Default); var vectorSet = new IMathVector <decimal> [3]; vectorSet[0] = new ArrayMathVector <decimal>(new decimal[] { 1, 1, 1 }); vectorSet[1] = new ArrayMathVector <decimal>(new decimal[] { -1, 0, 2 }); vectorSet[2] = new ArrayMathVector <decimal>(new decimal[] { 3, 5, 6 }); var reduced = lllReductionAlg.Run(vectorSet, 3M / 4); // O resultado esperado. var expected = new IMathVector <decimal> [3]; expected[0] = new ArrayMathVector <decimal>(new decimal[] { 0, 1, 0 }); expected[1] = new ArrayMathVector <decimal>(new decimal[] { 1, 0, 1 }); expected[2] = new ArrayMathVector <decimal>(new decimal[] { -1, 0, 2 }); this.AsserVectorLists(expected, reduced); }
public void RunTest_OnlyInequalitiesDouble() { var inputConstraintsMatrixText = "[[1,0,3],[0,2,2]]"; var inputConstraintsVectorText = "[4,12,18]"; var inputObjectiveFuncText = "[-3,-5]"; var inverseMatrixText = "[[1,0,0],[0,1,0],[0,0,1]]"; var cost = 0.0; var nonBasicVariables = new[] { 0, 1 }; var basicVariables = new[] { 2, 3, 4 }; // Leitura da matriz das retrições. var doubleElementsParser = new DoubleParser <string>(); var inputConstraintsMatrix = TestsHelper.ReadMatrix <double>( 3, 2, inputConstraintsMatrixText, (i, j) => new ArrayMathMatrix <double>(i, j), doubleElementsParser, true); // Leitura da matriz inversa. var inverseMatrix = TestsHelper.ReadMatrix <double>( 3, 3, inverseMatrixText, (i, j) => new ArraySquareMathMatrix <double>(i), doubleElementsParser, true) as ISquareMathMatrix <double>; // Leitura do vector de restrições. var vectorFactory = new ArrayVectorFactory <double>(); var inputConstraintsVector = TestsHelper.ReadVector <double>( 3, inputConstraintsVectorText, vectorFactory, doubleElementsParser, true); // Leitura da função objectivo. var inputObjectiveFunction = TestsHelper.ReadVector <double>( 2, inputObjectiveFuncText, vectorFactory, doubleElementsParser, true); // Objecto de entrada para o algoritmo do simplex. var simplexInput = new RevisedSimplexInput <double, double>( basicVariables, nonBasicVariables, inputObjectiveFunction, cost, inputConstraintsMatrix, inputConstraintsVector, inverseMatrix); // Executa o algoritmo do simplex. var doubleField = new DoubleField(); var target = new RevisedSimplexAlgorithm <double>(Comparer <double> .Default, doubleField); var actual = target.Run(simplexInput); // Verifica o custo Assert.AreEqual(36, actual.Cost); // Verifica a solução Assert.AreEqual(2, actual.Solution[0]); Assert.AreEqual(6, actual.Solution[1]); }