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)); }
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(); }
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(); }