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