public void basic_test() { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream); writer.Write(str); writer.Flush(); stream.Position = 0; loader = new FileLoader(stream); Problem p = loader.LoadProblem(); DvrpTaskSolver.FixClientsStartTimes(p); stream.Position = 0; double sol = loader.LoadSolution(); ProblemDivider divider = new ProblemDivider(); PartialProblemSolver solver = new PartialProblemSolver(); SolutionMerger merger = new SolutionMerger(); var partproblmes = divider.DivideProblem(p); List <PartialSolution> soluts = new List <PartialSolution>(); foreach (var part in partproblmes /*.Where(ee => ee.SetId == 17)*/) { soluts.Add(solver.SolvePartialProblem(part, p)); } var ssss = merger.MergeSolution(soluts, p); ssss.Result.ShouldBeInRange(sol - 5, sol + 5); }
private bool HelpingFunctionForTests(byte[] problem, TimeSpan timeout, int threadsCount, double expectectedResult, Stopwatch stopwatch) { Debug.WriteLine(stopwatch.ElapsedMilliseconds / 1000.0 + ": " + "problem serialized"); byte[] problemData; using (var memoryStream = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(memoryStream, Encoding.UTF8.GetString(problem)); problemData = memoryStream.ToArray(); } var taskSolver = new DvrpTaskSolver(problemData); var partialProblemsData = taskSolver.DivideProblem(threadsCount); Debug.WriteLine(stopwatch.ElapsedMilliseconds / 1000.0 + ": " + "problem divided; threadsCount=" + threadsCount); var tasks = new List <Task <byte[]> >(threadsCount); foreach (var partialProblemData in partialProblemsData) { var data = partialProblemData; tasks.Add(new Task <byte[]>(() => { var taskSolver2 = new DvrpTaskSolver(problemData); return(taskSolver2.Solve(data, timeout)); } )); tasks[tasks.Count - 1].Start(); } Task.WaitAll(tasks.ToArray()); Debug.WriteLine(stopwatch.ElapsedMilliseconds / 1000.0 + ": " + "partial solutions solved"); var finalSolutionData = taskSolver.MergeSolution(tasks.Select(task => task.Result).ToArray()); Debug.WriteLine(stopwatch.ElapsedMilliseconds / 1000.0 + ": " + "problems merged"); bool result; using (var memoryStream = new MemoryStream(finalSolutionData)) { var finalSolution = (string)_formatter.Deserialize(memoryStream); Debug.WriteLine(stopwatch.ElapsedMilliseconds / 1000.0 + ": " + finalSolution); var reg = new Regex(@"[-+]?\d+([,.]\d+)?"); MatchCollection m; m = reg.Matches(finalSolution); result = Math.Abs(Math.Round((double)new decimal(double.Parse(m[0].Value)), 2) - expectectedResult) < Double.Epsilon; } Debug.WriteLine(stopwatch.ElapsedMilliseconds / 1000.0 + ": " + "final solution deserialized"); return(result); }
private bool HelpingFunctionForTests(byte[] problem, TimeSpan timeout, int threadsCount, double expectectedResult, Stopwatch stopwatch) { Debug.WriteLine(stopwatch.ElapsedMilliseconds/1000.0 + ": " + "problem serialized"); byte[] problemData; using (var memoryStream = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(memoryStream, Encoding.UTF8.GetString(problem)); problemData = memoryStream.ToArray(); } var taskSolver = new DvrpTaskSolver(problemData); var partialProblemsData = taskSolver.DivideProblem(threadsCount); Debug.WriteLine(stopwatch.ElapsedMilliseconds/1000.0 + ": " + "problem divided; threadsCount=" + threadsCount); var tasks = new List<Task<byte[]>>(threadsCount); foreach (var partialProblemData in partialProblemsData) { var data = partialProblemData; tasks.Add(new Task<byte[]>(() => { var taskSolver2 = new DvrpTaskSolver(problemData); return taskSolver2.Solve(data, timeout); } )); tasks[tasks.Count - 1].Start(); } Task.WaitAll(tasks.ToArray()); Debug.WriteLine(stopwatch.ElapsedMilliseconds/1000.0 + ": " + "partial solutions solved"); var finalSolutionData = taskSolver.MergeSolution(tasks.Select(task => task.Result).ToArray()); Debug.WriteLine(stopwatch.ElapsedMilliseconds/1000.0 + ": " + "problems merged"); bool result; using (var memoryStream = new MemoryStream(finalSolutionData)) { var finalSolution = (string)_formatter.Deserialize(memoryStream); Debug.WriteLine(stopwatch.ElapsedMilliseconds / 1000.0 + ": " + finalSolution); var reg = new Regex(@"[-+]?\d+([,.]\d+)?"); MatchCollection m; m = reg.Matches(finalSolution); result = Math.Abs(Math.Round((double)new decimal(double.Parse(m[0].Value)), 2) - expectectedResult) < Double.Epsilon; } Debug.WriteLine(stopwatch.ElapsedMilliseconds / 1000.0 + ": " + "final solution deserialized"); return result; }