コード例 #1
0
        public LinearProgamSolution Solve(LinearProgram linearProgram)
        {
            //check if needs initialization
            bool needsInit = linearProgram.Coefficients.Any(c => c[0] < 0);

            if (needsInit)
            {
                //solve dual
                var dual    = _mapPrimalToDual.Map(linearProgram);
                var dualSol = SolveSingle(dual);

                //todo: check if feasbile
                if (dualSol.SolutionType != LinearProgramSolutionType.Solved)
                {
                    return(new LinearProgamSolution(0, 0, LinearProgramSolutionType.Infeasible));
                }

                //map back to primal
                var primal = _mapDualToPrimal.Map(dual);

                //restore objective
                _restoreObjective.Restore(primal, dual.OriginalObjectiveCoefficients, dual.OriginalNonBasicIndices);

                //solve
                var primalSol = SolveSingle(primal);
                return(primalSol);
            }
            else
            {
                return(SolveSingle(linearProgram));
            }
        }
コード例 #2
0
        public void ShouldMap_Vl01()
        {
            var primal = _reader.Read(DictionaryFiles + "vl1.dict");
            var dual   = _mapPrimalToDual.Map(primal);

            //verify m,n
            dual.M.ShouldEqual(primal.N);
            dual.N.ShouldEqual(primal.M);

            //verify indices
            dual.BasicIndices.Length.ShouldEqual(primal.NonBasicIndices.Length);
            dual.BasicIndices[1].ShouldEqual(1);
            dual.BasicIndices[2].ShouldEqual(2);

            dual.NonBasicIndices.Length.ShouldEqual(primal.BasicIndices.Length);
            dual.NonBasicIndices[1].ShouldEqual(3);
            dual.NonBasicIndices[2].ShouldEqual(4);
            dual.NonBasicIndices[3].ShouldEqual(5);
            dual.NonBasicIndices[4].ShouldEqual(6);

            VerifyDual(primal, dual);
        }