コード例 #1
0
ファイル: GomoriMethod.cs プロジェクト: Kant8/IOp
 private void RoundResult(SimplexMethodSolver sms)
 {
     sms.ResultX = RoundVector(sms.ResultX, ResultMeaningDecimals);
     sms.ResultCost = Math.Round(sms.ResultCost, ResultMeaningDecimals);
 }
コード例 #2
0
ファイル: GomoriMethod.cs プロジェクト: Kant8/IOp
        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);
        }
コード例 #3
0
ファイル: GomoriMethod.cs プロジェクト: Kant8/IOp
 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
     }
 }
コード例 #4
0
ファイル: GomoriMethod.cs プロジェクト: Kant8/IOp
        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);
            }
        }