예제 #1
0
        /// <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);
        }
예제 #3
0
        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]);
        }
예제 #4
0
        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]);
        }