Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 /// <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);
 }
Esempio n. 3
0
            /// <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];
            }
Esempio n. 4
0
        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"));
        }
Esempio n. 5
0
        /// <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;
        }
Esempio n. 6
0
        /// <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;
            }
        }
Esempio n. 7
0
        /// <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);
        }
Esempio n. 8
0
            /// <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];
            }