示例#1
0
        public static (Status status, FirstSimplexResult result) Solve(double[,] conditions, double[] constraints)
        {
            // ReSharper disable InconsistentNaming
            var A = LinearAlgebraUtils.BuildMatrixFrom2DArray(conditions);
            var b = LinearAlgebraUtils.BuildVectorFromArray(constraints);

            // if i-th b's element less than zero, multiply it and i-th A's row by -1
            Core.MultiplyByMinusOne(ref A, ref b);

            // form initial data for auxiliary problem solving
            var(
                initialConditions,
                initialObjectiveFunction,
                initialSolution,
                initialBasisIndices) =
                InitialValuesUtils.GetInitialValues(A, b);

            var mainPhase = new SimplexMainPhaseService(
                initialConditions.ToArray(),
                initialObjectiveFunction.ToArray(),
                initialSolution.ToArray(),
                initialBasisIndices);
            var result = mainPhase.Maximize();

            Debug.WriteLine($"{nameof(result.Solution)}:\n{string.Join(", ", result.Solution)}\n");
            Debug.WriteLine($"{nameof(result.BasisIndices)}:\n{string.Join(", ", result.BasisIndices)}\n");

            if (!result.HasSolutionChanged(initialSolution)) // lib-specific comparison to determine whether solving has failed
            {
                return(Status.Fail, FirstSimplexResult.Empty);
            }

            if (!result.IsCompatible(A.RowCount))
            {
                return(Status.Incompatible, FirstSimplexResult.Empty);
            }

            var correctedIndices = Core.GetCorrectedBasisIndices(result, A.ColumnCount, A.RowCount, initialConditions);

            return(Status.Success, FirstSimplexResult.Create(result.Solution.Take(A.ColumnCount), correctedIndices));
        }
示例#2
0
        private static void OIExample2()
        {
            WriteLine(nameof(OIExample2));
            var conditions = new double[, ]
            {
                { 1, -1, 1, 0 },
                { -1, 1, 0, 1 }
            };

            var objectiveFunctionComponents = new double[] { 1, 0, 0, 0 };
            var constraints     = new double[] { 1, 2 };
            var initialSolution = new double[] { 1, 0, 0, 3 };
            var basisIndices    = new SortedSet <int>(new[] { 0, 3 });

            var simplexService = new SimplexMainPhaseService(conditions, objectiveFunctionComponents,
                                                             initialSolution, basisIndices);

            var result = simplexService.Maximize();

            WriteLine(result);
            WriteLine();
        }
示例#3
0
        private static void Task12()
        {
            WriteLine(nameof(Task12));
            var conditions = new double[, ]
            {
                { 5, 4, 1, 0, 0, 0 },
                { 1, 2, 0, 1, 0, 0 },
                { 1, 0, 0, 0, 1, 0 },
                { 0, 1, 0, 0, 0, 1 }
            };

            var objectiveFunctionComponents = new double[] { 21, 25, 0, 0, 1, 0 };
            var constraints     = new double[] { 50, 16, 9, 7 };
            var initialSolution = new double[] { 0, 0, 50, 16, 9, 7 };
            var basisIndices    = new SortedSet <int>(new[] { 2, 3, 4, 5 });

            var simplexService = new SimplexMainPhaseService(conditions, objectiveFunctionComponents,
                                                             initialSolution, basisIndices);

            var result = simplexService.Maximize();

            WriteLine(result);
            WriteLine();
        }