/// <summary> /// Constructor. /// </summary> /// <param name="problem">The problem instance to solve.</param> public DvrpSolver(DvrpProblem problem) { State = UCCTaskSolver.TaskSolver.TaskSolverState.OK; _dvrpProblem = problem; var n = _dvrpProblem.Requests.Length; _distances = new double[n, n]; for (var i = 0; i < n; i++) { for (var j = i + 1; j < n; j++) { var dx = _dvrpProblem.Requests[i].X - _dvrpProblem.Requests[j].X; var dy = _dvrpProblem.Requests[i].Y - _dvrpProblem.Requests[j].Y; _distances[i, j] = _distances[j, i] = Math.Sqrt(dx * dx + dy * dy); } } var m = _dvrpProblem.Depots.Length; _depotDistances = new double[m, n]; for (var i = 0; i < m; i++) { for (var j = 0; j < n; j++) { var dx = _dvrpProblem.Depots[i].X - _dvrpProblem.Requests[j].X; var dy = _dvrpProblem.Depots[i].Y - _dvrpProblem.Requests[j].Y; _depotDistances[i, j] = Math.Sqrt(dx * dx + dy * dy); } } _tspSolver = new TspSolver(this); }
/// <summary> /// Constructor. /// </summary> /// <param name="problem">The problem instance to solve.</param> public DvrpSolver(DvrpProblem problem) { State = UCCTaskSolver.TaskSolver.TaskSolverState.OK; _dvrpProblem = problem; var n = _dvrpProblem.Requests.Length; _distances = new double[n, n]; for (var i = 0; i < n; i++) { for (var j = i + 1; j < n; j++) { var dx = _dvrpProblem.Requests[i].X - _dvrpProblem.Requests[j].X; var dy = _dvrpProblem.Requests[i].Y - _dvrpProblem.Requests[j].Y; _distances[i, j] = _distances[j, i] = Math.Sqrt(dx*dx + dy*dy); } } var m = _dvrpProblem.Depots.Length; _depotDistances = new double[m, n]; for (var i = 0; i < m; i++) { for (var j = 0; j < n; j++) { var dx = _dvrpProblem.Depots[i].X - _dvrpProblem.Requests[j].X; var dy = _dvrpProblem.Depots[i].Y - _dvrpProblem.Requests[j].Y; _depotDistances[i, j] = Math.Sqrt(dx*dx + dy*dy); } } _tspSolver = new TspSolver(this); }
/// <summary> /// Constructor. /// </summary> /// <param name="solver">The root class.</param> public TspSolver(DvrpSolver solver) { _distances = solver._distances; _depotDistances = solver._depotDistances; _dvrpProblem = solver._dvrpProblem; _visited = new bool[_dvrpProblem.Requests.Length]; }
static void Main(string[] args) { EventLogger.AddAppender(new Log4NetAppender()); var ipAddress = "127.0.0.1"; var port = 8123; IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(ipAddress), port); Console.WriteLine("Choose component: \n" + "1 ComputationalClient\n" + "2 TaskManager\n" + "3 ComputationalNode\n"); Console.WriteLine("Select: "); int componentType; int.TryParse(Console.ReadLine(), out componentType); Component component = new ComputationalClient(); switch (componentType) { case 1: component = new ComputationalClient(); break; case 2: component = new TaskManager(); break; case 3: component = new ComputationalNode(); break; } component.SolvableProblems = new List <string>() { "MultiplyProblem", "DVRP" }; component.Register(endPoint); var filePath = @"DvrpData\okulD.vrp"; var problem = new DvrpProblem(new DvrpProblemData(filePath)); //var problem = new MultiplyProblem(10, 3, 1000000); while (true) { Common.Abstractions.Message msg = null; int result; Console.WriteLine("RegisterMessage was sent\n" + "Choose another message: \n" + "1 RegisterMessage\n" + "2 RegisterResponseMessage\n" + "3 StatusMessage\n" + "4 SolveRequestMessage\n" + "5 SolveRequestResponseMessage\n" + "6 DivideProblemMessage\n" + "7 SolutionRequestMessage\n" + "8 PartialProblemsMessage\n" + "9 Solutions message\n" + "10 Exit" ); Console.WriteLine("Choose message to send: "); if (int.TryParse(Console.ReadLine(), out result) == false || result < 1 || result > 10) { Console.WriteLine("\nWrong input\n\n"); continue; } switch (result) { case 1: msg = new RegisterMessage(component.Type, 0, component.SolvableProblems); break; case 2: msg = new RegisterResponseMessage(123L, DateTime.Now); break; case 3: msg = new StatusMessage(123L, null); break; case 4: msg = new SolveRequestMessage(problem.ProblemType, problem.SolvingTimeout, problem.Data); break; case 5: msg = new SolveRequestResponseMessage(123L); break; case 6: msg = new DivideProblemMessage("Problem type", 123L, Encoding.UTF8.GetBytes("test1"), 321L); break; case 7: msg = new SolutionRequestMessage(123L); break; case 8: msg = new SolvePartialProblemsMessage("problem type", 123L, Encoding.UTF8.GetBytes("test1"), 333L, null); break; case 9: msg = new SolutionsMessage("problemy type", 123L, Encoding.UTF8.GetBytes("test1"), null); break; case 10: Environment.Exit(0); break; } component.SendMessage(msg.Serialize()); } //component.SendMessage(Encoding.UTF8.GetBytes("dupa")); }
/// <summary> /// Divide the problem into partial problems. /// </summary> /// <param name="dvrpProblem">The problem instance to divide.</param> /// <param name="numberOfParts">How many parts to divide into.</param> /// <returns>Output partial problems.</returns> public DvrpPartialProblem[] Divide(DvrpProblem dvrpProblem, int numberOfParts) { // we generate all the partitions // set {{0 0 0 0 0}} represents {{0 1 2 3 4}} // set {{0 1 2 3 4}} represents {{0}{1}{2}{3}{4}} // set {{0 1 2 1 2}} represents {{0}{1 3}{2 4}} // part - current partition // max[i] = Max{max[i-1], part[i-1]} // max[0] = -1 // example: // 0 0 0 // 0 0 1 // 0 1 0 // 0 1 1 // 0 1 2 if (numberOfParts < 1) throw new ArgumentOutOfRangeException("numberOfParts"); var n = dvrpProblem.Requests.Length; var part = new int[n]; var max = new int[n]; var maxNumberofSets = TriangularMethodBellNumber(n); var numberOfSetsForThread = maxNumberofSets/(ulong) numberOfParts; var result = new DvrpPartialProblem[numberOfParts]; var solver = new DvrpSolver(dvrpProblem); var approximateResult = solver.SolveApproximately(); for (var i = n - 2; i > -1; --i) part[i] = 0; part[n - 1] = max[0] = -1; var partLast = (int[]) part.Clone(); ulong j = 0; var k = 0; do { // checking if max[i] == Max{max[i-1], part[i-1]} for (var i = 1; i < n; ++i) { if (max[i - 1] < part[i - 1]) max[i] = part[i - 1]; else max[i] = max[i - 1]; } // we check if the last elements of the set are in their current maximum // for example // 01200345 p = 7 // 01200340 p = 6 // 01200300 p = 5 // 01200000 p = 4 // and now we can increment element for after following loop // 01201000 var p = n - 1; while (part[p] == max[p] + 1) { part[p] = 0; p = p - 1; } #region optimalization // now it is (n^2) insted of (B*n) if (p <= n - 2 && p > 1 && CheckZeros(part, p, n)) { var tmp = CalculateCombinations(max[p], p, n); if (tmp > numberOfSetsForThread - j - 1) { part[p] = part[p] + 1; ++j; } else { part[p] = max[p] + 1; for (var i = p + 1; i < n; i++) { part[i] = part[i - 1] + 1; } j += tmp; } } else if (p == n - 1 && part[p] == 0) { var tmp = (int) Math.Min(numberOfSetsForThread - j, (double) max[p] + 1); part[p] = tmp; j += (ulong) part[p]; } else { part[p] = part[p] + 1; ++j; } #endregion if (j == numberOfSetsForThread) { result[k] = new DvrpPartialProblem(partLast, approximateResult, j, part); partLast = (int[]) part.Clone(); ++k; j = 0; if (k == numberOfParts - 1) { break; } } // ReSharper disable once LoopVariableIsNeverChangedInsideLoop } while (part[n - 1] != n - 1); for (var i = 0; i < n; i++) { part[i] = i; } result[k] = new DvrpPartialProblem(partLast, approximateResult, maxNumberofSets - (ulong) k*numberOfSetsForThread, part); return result; }
/// <summary> /// Constructor. /// </summary> /// <param name="problemData">Binary data with all information about the problem. String should be loaded from a .vrp file.</param> public DvrpTaskSolver(byte[] problemData) : base(problemData) { try { string problem; using (var mem = new MemoryStream(problemData)) { problem = (string) _formatter.Deserialize(mem); } var data = Encoding.UTF8.GetBytes(problem); using (var mem = new MemoryStream(data)) using (var r = new StreamReader(mem)) { var reg = new Regex(@"-?\d+"); MatchCollection m; for (var i = 0; i < 6; i++) r.ReadLine(); var line = r.ReadLine(); m = reg.Matches(line); var numVisits = int.Parse(m[0].Value); // num_location r.ReadLine(); line = r.ReadLine(); m = reg.Matches(line); var numVehicles = int.Parse(m[0].Value); line = r.ReadLine(); m = reg.Matches(line); var capacity = int.Parse(m[0].Value); for (var i = 0; i < 4; i++) r.ReadLine(); var demands = new int[numVisits]; for (var i = 0; i < demands.Length; i++) { line = r.ReadLine(); m = reg.Matches(line); demands[i] = int.Parse(m[1].Value); } // header r.ReadLine(); var locationCoord = new int[numVisits + 1, 2]; for (var i = 0; i < locationCoord.GetLength(0); i++) { line = r.ReadLine(); m = reg.Matches(line); locationCoord[i, 0] = int.Parse(m[1].Value); locationCoord[i, 1] = int.Parse(m[2].Value); } for (var i = -numVisits; i < 4; i++) r.ReadLine(); var durations = new int[numVisits]; for (var i = 0; i < demands.Length; i++) { line = r.ReadLine(); m = reg.Matches(line); durations[i] = int.Parse(m[1].Value); } // header r.ReadLine(); line = r.ReadLine(); m = reg.Matches(line); var depotStart = int.Parse(m[1].Value); var depotEnd = int.Parse(m[2].Value); for (var i = 0; i < 2; i++) r.ReadLine(); var timeAvail = new int[numVisits]; for (var i = 0; i < timeAvail.Length; i++) { line = r.ReadLine(); m = reg.Matches(line); timeAvail[i] = int.Parse(m[1].Value); } var requests = new Request[numVisits]; for (var i = 0; i < requests.Length; i++) { requests[i] = new Request(locationCoord[i + 1, 0], locationCoord[i + 1, 1], demands[i], timeAvail[i], durations[i]); } _dvrpProblem = new DvrpProblem(numVehicles, capacity, new[] { new Depot(locationCoord[0, 0], locationCoord[0, 1], depotStart, depotEnd) }, requests); } } catch (Exception ex) { Exception = ex; State = TaskSolverState.Error; } }
/// <summary> /// Divide the problem into partial problems. /// </summary> /// <param name="dvrpProblem">The problem instance to divide.</param> /// <param name="numberOfParts">How many parts to divide into.</param> /// <returns>Output partial problems.</returns> public DvrpPartialProblem[] Divide(DvrpProblem dvrpProblem, int numberOfParts) { // we generate all the partitions // set {{0 0 0 0 0}} represents {{0 1 2 3 4}} // set {{0 1 2 3 4}} represents {{0}{1}{2}{3}{4}} // set {{0 1 2 1 2}} represents {{0}{1 3}{2 4}} // part - current partition // max[i] = Max{max[i-1], part[i-1]} // max[0] = -1 // example: // 0 0 0 // 0 0 1 // 0 1 0 // 0 1 1 // 0 1 2 if (numberOfParts < 1) { throw new ArgumentOutOfRangeException("numberOfParts"); } var n = dvrpProblem.Requests.Length; var part = new int[n]; var max = new int[n]; var maxNumberofSets = TriangularMethodBellNumber(n); var numberOfSetsForThread = maxNumberofSets / (ulong)numberOfParts; var result = new DvrpPartialProblem[numberOfParts]; var solver = new DvrpSolver(dvrpProblem); var approximateResult = solver.SolveApproximately(); for (var i = n - 2; i > -1; --i) { part[i] = 0; } part[n - 1] = max[0] = -1; var partLast = (int[])part.Clone(); ulong j = 0; var k = 0; do { // checking if max[i] == Max{max[i-1], part[i-1]} for (var i = 1; i < n; ++i) { if (max[i - 1] < part[i - 1]) { max[i] = part[i - 1]; } else { max[i] = max[i - 1]; } } // we check if the last elements of the set are in their current maximum // for example // 01200345 p = 7 // 01200340 p = 6 // 01200300 p = 5 // 01200000 p = 4 // and now we can increment element for after following loop // 01201000 var p = n - 1; while (part[p] == max[p] + 1) { part[p] = 0; p = p - 1; } #region optimalization // now it is (n^2) insted of (B*n) if (p <= n - 2 && p > 1 && CheckZeros(part, p, n)) { var tmp = CalculateCombinations(max[p], p, n); if (tmp > numberOfSetsForThread - j - 1) { part[p] = part[p] + 1; ++j; } else { part[p] = max[p] + 1; for (var i = p + 1; i < n; i++) { part[i] = part[i - 1] + 1; } j += tmp; } } else if (p == n - 1 && part[p] == 0) { var tmp = (int)Math.Min(numberOfSetsForThread - j, (double)max[p] + 1); part[p] = tmp; j += (ulong)part[p]; } else { part[p] = part[p] + 1; ++j; } #endregion if (j == numberOfSetsForThread) { result[k] = new DvrpPartialProblem(partLast, approximateResult, j, part); partLast = (int[])part.Clone(); ++k; j = 0; if (k == numberOfParts - 1) { break; } } // ReSharper disable once LoopVariableIsNeverChangedInsideLoop } while (part[n - 1] != n - 1); for (var i = 0; i < n; i++) { part[i] = i; } result[k] = new DvrpPartialProblem(partLast, approximateResult, maxNumberofSets - (ulong)k * numberOfSetsForThread, part); return(result); }