private ResultState SolveInternal()
        {
            PrintDebugRessourcesBefore("SolveInternal");

            var param = new MPSolverParameters();

            param.SetDoubleParam(MPSolverParameters.RELATIVE_MIP_GAP, MIP_GAP);
            if (timelimit != 0)
            {
                solver.SetTimeLimit(timelimit);
            }
#if DEBUG
            solver.EnableOutput();
#else
            solver.SuppressOutput();
#endif
            resultState = FromGoogleResultState(solver.Solve(param));

            PrintDebugRessourcesAfter();
#if DEBUG
            PrintDebugOutput();
#endif

            return(resultState);
        }
예제 #2
0
        static void Main(string[] args)
        {
            var @params = new MPSolverParameters();

            @params.SetDoubleParam(MPSolverParameters.DoubleParam.RELATIVE_MIP_GAP, 0);
            @params.SetDoubleParam(MPSolverParameters.DoubleParam.PRIMAL_TOLERANCE, 0);
            @params.SetDoubleParam(MPSolverParameters.DoubleParam.DUAL_TOLERANCE, 0);

            var solver = new Solver("BOP_Knapsack", (Solver.OptimizationProblemType) 12);

            BuildModel(solver);

            var result = solver.Solve(@params);

            Console.WriteLine("Using BOP:");
            Console.WriteLine("result: " + result);
            Console.WriteLine("objective: " + solver.Objective().Value());
            Console.WriteLine("bound: " + solver.Objective().BestBound());

            solver = new Solver("CBC_Knapsack", (Solver.OptimizationProblemType) 5);
            BuildModel(solver);

            result = solver.Solve(@params);
            Console.WriteLine("Using CBC:");
            Console.WriteLine("result: " + result);
            Console.WriteLine("objective: " + solver.Objective().Value());
            Console.WriteLine("bound: " + solver.Objective().BestBound());
        }
        // TODO: TBD: taking LinearSolver assembly(ies) out of the build configuration for the time being until a usage/migration path can be established...
        /// <summary>
        /// Builds the <see cref="MPSolverParameters"/> instance given a set of
        /// <see cref="MpParamSpec"/> pairs.
        /// </summary>
        /// <param name="specs"></param>
        /// <returns></returns>
        protected virtual MPSolverParameters BuildParameters(params MpParamSpec[] specs)
        {
            var parameters = new MPSolverParameters();

            foreach (var(spec, value) in specs)
            {
                parameters.SetDoubleParam(spec.ForSolver(), value);
            }

            ClrCreatedObjects.Add(parameters);
            return(parameters);
        }
        private MPSolverParameters BuildParameters(IEnumerable <double> values)
        {
            var parameters = new MPSolverParameters();

            // ReSharper disable PossibleMultipleEnumeration
            for (var i = 0; i < values.Count(); i++)
            {
                parameters.SetDoubleParam(i, values.ElementAt(i));
                // ReSharper enable PossibleMultipleEnumeration
            }
            ClrCreatedObjects.Add(parameters);
            return(parameters);
        }
예제 #5
0
        public static void Run(string inputFile)
        {
            Console.WriteLine("Start Knapsack solver...");

            //read input
            string[] inputs = File.ReadAllLines(inputFile);
            string[] line   = inputs[0].Split(' ');

            int N = Convert.ToInt32(line[0]); // number of objects to pick from
            int K = Convert.ToInt32(line[1]); // capacity of the sack

            //create solver
            // GLOP_LINEAR_PROGRAMMING, CBC_MIXED_INTEGER_PROGRAMMING
            Google.OrTools.LinearSolver.Solver solver
                = Google.OrTools.LinearSolver.Solver.CreateSolver("knapsack", "CBC_MIXED_INTEGER_PROGRAMMING");

            //objective
            Objective objective = solver.Objective();

            objective.SetMaximization();

            //variables
            Variable[] variables = solver.MakeBoolVarArray(N);

            //constraints
            Constraint capacityConstraint = solver.MakeConstraint(0, K);

            for (int i = 0; i < N; i++)
            {
                //get input parameters
                line = inputs[i + 1].Split(' ');
                double value  = Convert.ToDouble(line[0]);
                double weight = Convert.ToDouble(line[1]);

                Variable x = variables[i];

                //add to objective
                objective.SetCoefficient(x, value);

                //add to constraint
                capacityConstraint.SetCoefficient(x, weight);
            }

            MPSolverParameters solverParams = new MPSolverParameters();

            Console.WriteLine("Start solving...");
            int resultStatus = solver.Solve();

            double resultObjective = 0.0;
            string resultVariables = "";

            Console.WriteLine("Solver finished");
            Console.WriteLine("Solution status: " + resultStatus.ToString());

            string outputFile = new FileInfo(inputFile).Directory.FullName + @"\output.txt";

            if (File.Exists(outputFile))
            {
                File.Delete(outputFile);
            }

            if (resultStatus != Google.OrTools.LinearSolver.Solver.OPTIMAL)
            {
                resultStatus = 0;
                Console.WriteLine("The problem don't have an optimal solution.");
            }
            else
            {
                resultStatus = 1;
                Console.WriteLine("Solution objective: " + solver.Objective().Value().ToString());
                resultObjective = solver.Objective().Value();

                foreach (Variable x in variables)
                {
                    if (resultVariables == "")
                    {
                        resultVariables = x.SolutionValue().ToString();
                    }
                    else
                    {
                        resultVariables += " " + x.SolutionValue().ToString();
                    }
                }
                Console.WriteLine("Solution variables: " + resultVariables.ToString());
            }

            using (System.IO.StreamWriter file = new System.IO.StreamWriter(outputFile))
            {
                file.WriteLine(resultObjective.ToString() + " " + resultStatus.ToString());
                file.WriteLine(resultVariables);
            }
        }