Example #1
0
        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;
        }