private void RoundResult(SimplexMethodSolver sms) { sms.ResultX = RoundVector(sms.ResultX, ResultMeaningDecimals); sms.ResultCost = Math.Round(sms.ResultCost, ResultMeaningDecimals); }
private void AddNewRestrictions(SimplexMethodSolver solvedProblem) { var baseJ = solvedProblem.ResultBaseJ; var optimalX = solvedProblem.ResultX; foreach (var j in J.Intersect(baseJ).OrderBy(j => j)) { if (!IsInteger(optimalX[j])) { NonIntegerJ = j; break; } } var identity = new DenseVector(baseJ.Count); identity[baseJ.IndexOf(NonIntegerJ)] = 1; var baseA = GetBaseMatrix(solvedProblem.A, baseJ); var y = identity*baseA.Inverse(); var alpha = y * CurrA; alpha = RoundVector((DenseVector)alpha, MeaningDecimals); var f = alpha - DenseVector.OfEnumerable(alpha.Select(Math.Floor)); f = RoundVector((DenseVector)f, MeaningDecimals); //f = f - DenseVector.OfEnumerable(Enumerable.Repeat(Eps*2, f.Count)); var beta = y * CurrB; beta = Math.Round(beta, MeaningDecimals); beta = beta - Math.Floor(beta); beta = Math.Round(beta, MeaningDecimals); InsertNewRestrictionRow((DenseVector)f, beta); FakeJ.Add(alpha.Count); }
private void DeleteUnnecessaryRestrictions(SimplexMethodSolver solvedProblem) { var baseJ = solvedProblem.ResultBaseJ; foreach (var j0 in baseJ.Intersect(FakeJ)) { var i0 = GetFakeRowIndex(j0); for (int i = i0 + 1; i < CurrA.RowCount; i++) { for (int j = 0; j < j0; j++) { CurrA[i, j] = CurrA[i, j] - CurrA[i, j0]*CurrA[i0, j]; } CurrA[i, j0] = 0; CurrB[i] = CurrB[i] - CurrA[i, j0]*CurrB[i0]; } DeleteRow(CurrA, i0); // delete from b } }
public DenseVector Solve() { Eps = Math.Round(Math.Pow(0.1, MeaningDecimals), MeaningDecimals); J = Enumerable.Range(0, A.ColumnCount).ToList(); FakeJ = new List<int>(); CurrA = DenseMatrix.OfMatrix(A); CurrB = DenseVector.OfVector(b); CurrC = DenseVector.OfVector(-c); // !!! to min while (true) { var sms = new SimplexMethodSolver(CurrA, CurrB, CurrC) {MeaningDecimals = MeaningDecimals}; sms.Solve(); sms.RoundResult(); if (AreAllInteger(sms.ResultX)) { RoundResult(sms); ResultCost = sms.ResultCost; ResultX = (DenseVector)sms.ResultX.SubVector(0, J.Count); return ResultX; } //DeleteUnnecessaryRestrictions(sms); AddNewRestrictions(sms); } }