예제 #1
0
 public PartialSolution SolvePartialProblem(PartialProblem partialProblem, Problem problem)
 {
     if (partialProblem.Clients.Count != 0)
     {
         BestSolution    = double.MaxValue;
         Clients         = partialProblem.Clients;
         Depots          = problem.Depots;
         VehicleCapacity = problem.VehiclesCapacity;
         VehicleSpeed    = problem.VehicleSpeed;
         CurrentPath     = new List <IDvrpObject>();
         var startDepot = Depots.OrderBy(item => item.StartTime).ToList()[0];
         CurrentPath.Add(startDepot);
         SolveRec(startDepot.StartTime, VehicleCapacity);
     }
     else
     {
         BestSolution = 0;
     }
     return(new PartialSolution
     {
         Id = partialProblem.Id,
         Clients = partialProblem.Clients,
         Result = BestSolution
     });
 }
예제 #2
0
 /// <summary>
 /// Creates PartialSolution instance.
 /// </summary>
 /// <param name="partialProblem">Corresponding partial problem.</param>
 /// <param name="data">Solution data.</param>
 /// <param name="computationsTime">Foregoing computations time.</param>
 /// <param name="timeoutOccured">True if the computations that generated this partial solution were stopped due to the timeout.</param>
 public PartialSolution(PartialProblem partialProblem, byte[] data, ulong computationsTime, bool timeoutOccured)
 {
     PartialProblem = partialProblem;
     Data = data;
     ComputationsTime = computationsTime;
     TimeoutOccured = timeoutOccured;
 }
예제 #3
0
        public static SolvePartialProblemsMessage CreateSolvePartialProblemsMessage()
        {
            string problemType = "TSP";
            ulong  id          = 12;

            byte[] commonData     = { 1, 23, 25, 2, 5, 5, 5, 5, 2, 26, 87 };
            ulong  solvingTimeout = 1000;

            // fields for PartialProblem1
            ulong taskId1 = 123;

            byte[]         data1           = { 24, 252, 6, 43, 57, 88 };
            ulong          nodeId1         = 1;
            PartialProblem partialProblem1 = new PartialProblem(taskId1, data1, nodeId1);

            // fields for PartialProblem2
            ulong taskId2 = 321;

            byte[]         data2           = { 24, 252, 6, 43, 57, 88 };
            ulong          nodeId2         = 2;
            PartialProblem partialProblem2 = new PartialProblem(taskId2, data2, nodeId2);

            PartialProblem[] partialProblems = { partialProblem1, partialProblem2 };

            SolvePartialProblemsMessage expectedMessage = new SolvePartialProblemsMessage(problemType, id, commonData,
                                                                                          solvingTimeout, partialProblems);

            return(expectedMessage);
        }
예제 #4
0
 /// <summary>
 /// Creates PartialSolution instance.
 /// </summary>
 /// <param name="partialProblem">Corresponding partial problem.</param>
 /// <param name="data">Solution data.</param>
 /// <param name="computationsTime">Foregoing computations time.</param>
 /// <param name="timeoutOccured">True if the computations that generated this partial solution were stopped due to the timeout.</param>
 public PartialSolution(PartialProblem partialProblem, byte[] data, ulong computationsTime, bool timeoutOccured)
 {
     PartialProblem   = partialProblem;
     Data             = data;
     ComputationsTime = computationsTime;
     TimeoutOccured   = timeoutOccured;
 }
예제 #5
0
 public byte[] SerializePartialProblem(PartialProblem partialProblem)
 {
     using (MemoryStream stream = new MemoryStream())
     {
         formatter.Serialize(stream, partialProblem);
         return(stream.ToArray());
     }
 }
예제 #6
0
        /*******************************************************************/
        /************************ PRIVATE METHODS **************************/
        /*******************************************************************/

        /*******************************************************************/
        /************************* PUBLIC METHODS **************************/
        /*******************************************************************/

        public void Start()
        {
            switch (currentTask.Status)
            {
            case TaskStatus.Dividing:

                byte[][] dividedProblems = taskSolver.DivideProblem(4);

                PartialProblem[] partialProblems = new PartialProblem[dividedProblems.Count()];
                for (int i = 0; i < dividedProblems.Count(); i++)
                {
                    partialProblems[i] = new PartialProblem((ulong)currentTask.ID, dividedProblems[i], (ulong)NodeID);
                }
                SolvePartialProblemsMessage solvePartialProblemsMessage = new SolvePartialProblemsMessage(currentTask.Type, (ulong)currentTask.ID, currentTask.CommonData, (ulong)4, partialProblems);
                Console.Write(">>Sending solve partial problems message. ");
                messageProcessor.Communicate(solvePartialProblemsMessage);
                this.statusThread.State = StatusThreadState.Idle;
                this.currentTask        = null;

                break;

            case TaskStatus.Solving:

                byte[]     solvedPartialProblem = taskSolver.Solve(currentTask.BaseData, new TimeSpan(0, 0, 5));
                Solution[] solutions            = new Solution[1];
                //TODO subTask id, timeout checking , computations time
                solutions[0] = new Solution((ulong)currentTask.ID, false, SolutionsSolutionType.Partial, 4000, solvedPartialProblem);

                SolutionsMessage solutionMessage = new SolutionsMessage(currentTask.Type, (ulong)currentTask.ID, currentTask.CommonData, solutions);
                Console.WriteLine(">>Sending solution message. ");
                messageProcessor.Communicate(solutionMessage);
                statusThread.State = StatusThreadState.Idle;
                this.currentTask   = null;
                break;

            case TaskStatus.Merging:
                byte[][] partialSolutions = new byte[currentTask.subTasks.Count()][];
                for (int i = 0; i < currentTask.subTasks.Count(); i++)
                {
                    partialSolutions[i] = currentTask.subTasks[i].BaseData;
                }
                byte[] mergedSolution = taskSolver.MergeSolution(partialSolutions);

                Solution[] solution = new Solution[1];
                //TODO subTask id, timeout checking , computations time
                solution[0] = new Solution((ulong)currentTask.ID, false, SolutionsSolutionType.Final, 4000, mergedSolution);
                SolutionsMessage finalSolutionMessage = new SolutionsMessage(currentTask.Type, (ulong)currentTask.ID, currentTask.CommonData, solution);
                messageProcessor.Communicate(finalSolutionMessage);
                this.statusThread.State = StatusThreadState.Idle;
                this.currentTask        = null;
                break;
            }
            // Implement in private methods:
            // Depending on what has to be computed
            // run a task solver method.

            // TODO collect result.
        }
예제 #7
0
        /// <summary>
        /// Adds new partial problem to the system.
        /// </summary>
        /// <param name="problemId">ID of the problem instance this partial problem bleongs to.</param>
        /// <param name="partialProblemId">ID of the partial problem withing the problem instance.</param>
        /// <param name="privateData">Partial problem private data.</param>
        public void AddPartialProblem(ulong problemId, ulong partialProblemId, byte[] privateData)
        {
            // Make sure the corresponding problem instance exists.
            Problem problem;

            if (!_problems.TryGetValue(problemId, out problem))
            {
                Logger.Error("Corresponding problem instance doesn't exist.");
                return;
            }

            // Make sure that state of the corresponding problem instance is set to "being divided".
            if (problem.State != Problem.ProblemState.BeingDivided)
            {
                Logger.Error("Corresponding problem's state is invalid.");
                return;
            }

            // Make sure the corresponding problem's property 'NumberOfParts' is set to a positive integer.
            if (!problem.NumberOfParts.HasValue || problem.NumberOfParts < 1)
            {
                Logger.Error("Corresponding problem's 'NumberOfParts' property is not a positive integer.");
                return;
            }

            // Make sure the problem instance's number of partial problems & partial solutions is not greater than 'NumberOfParts' (excluding the partial problem being added).
            var ppNum = _partialProblems.Count(pair => pair.Key.Item1 == problemId);
            var psNum = _partialSolutions.Count(pair => pair.Key.Item1 == problemId);

            if (ppNum + psNum == (int)problem.NumberOfParts - 1)
            {
                Logger.Info("Got all partial problems (id: " + problem.Id + ").");
                problem.State = Problem.ProblemState.AwaitingSolution;
            }
            else if (ppNum + psNum > (int)problem.NumberOfParts - 1)
            {
                Logger.Warn("Received more partial problems than expected.");
                return;
            }

            // Create partial problem instance.
            var partialProblem = new PartialProblem(partialProblemId, problem, privateData)
            {
                State           = PartialProblem.PartialProblemState.AwaitingComputation,
                ComputingNodeId = null
            };

            // Add partial problem to the set.
            var pairId = new Tuple <ulong, ulong>(problemId, partialProblemId);

            _partialProblems.Add(pairId, partialProblem);

            Logger.Info("Added new partial problem (id: " + problemId + "/" + partialProblemId + ", type: " +
                        problem.Type + ").");
        }
예제 #8
0
        /// <summary>
        /// function sending PartialProblems message
        /// </summary>
        /// <param name="numOfTask"></param>
        /// <param name="partialList"></param>
        /// <param name="messagePackage"></param>
        /// <returns></returns>
        private bool SendPartialProblemsMessage(int numOfTask, List <PartialProblem> partialList, MessagePackage messagePackage)
        {
            PartialProblem[] partialProblems = new PartialProblem[partialList.Count];
            for (int j = 0; j < partialList.Count; j++)
            {
                partialProblems[j] = partialList[j];
            }
            SolvePartialProblemsMessage solvePartialProblemsMessage = new SolvePartialProblemsMessage(taskTracker.Tasks[numOfTask].Type, (ulong)taskTracker.Tasks[numOfTask].ID, taskTracker.Tasks[numOfTask].CommonData, (ulong)4, partialProblems);

            server.Send(messagePackage.Socket, solvePartialProblemsMessage);

            SmartConsole.PrintLine("Solve Partial Problems Message has been send (to Computational node). Number of subTasks." + partialList.Count, SmartConsole.DebugLevel.Advanced);

            return(true);
        }
        public void Parse_XMLString_SolvePartialProblemsMessage()
        {
            /*********** Actual message ***********/
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"xml_samples\SolvePartialProblems.xml");

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(path);
            string xmlStr = xmlDoc.OuterXml;

            string name = Message.GetMessageName(xmlStr);
            SolvePartialProblemsMessage actualMessage = null;

            if (name == SolvePartialProblemsMessage.ELEMENT_NAME)
            {
                actualMessage = SolvePartialProblemsMessage.Construct(xmlStr);
            }

            /*********** Expected message ***********/
            string problemType = "TSP";
            ulong  id          = 12;

            byte[] commonData     = { 1, 23, 25, 2, 5, 5, 5, 5, 2, 26, 87 };
            ulong  solvingTimeout = 1000;

            // fields for PartialProblem1
            ulong taskId1 = 123;

            byte[]         data1           = { 24, 252, 6, 43, 57, 88 };
            ulong          nodeId1         = 1;
            PartialProblem partialProblem1 = new PartialProblem(taskId1, data1, nodeId1);

            // fields for PartialProblem2
            ulong taskId2 = 321;

            byte[]         data2           = { 24, 252, 6, 43, 57, 88 };
            ulong          nodeId2         = 2;
            PartialProblem partialProblem2 = new PartialProblem(taskId2, data2, nodeId2);

            PartialProblem[] partialProblems = { partialProblem1, partialProblem2 };

            SolvePartialProblemsMessage expectedMessage = new SolvePartialProblemsMessage(problemType, id, commonData,
                                                                                          solvingTimeout, partialProblems);

            Assert.AreEqual(expectedMessage, actualMessage);
        }
예제 #10
0
파일: MessageTests.cs 프로젝트: Bajena/IO2
        public void SolvePartialProblemsSerializationTest()
        {
            byte[] byteArray = Encoding.UTF8.GetBytes("Test Byte Array");

            PartialProblem partialProblem = new PartialProblem
            {
                Data   = byteArray,
                TaskId = 123L,
            };

            List <PartialProblem> partialProblems = new List <PartialProblem>();

            partialProblems.Add(partialProblem);

            var partialProblemsMessage = new SolvePartialProblemsMessage("Problem Type", 123L, byteArray, 122L, partialProblems);

            var result = partialProblemsMessage.SerializeToXml();

            Assert.IsNotNull(result);
            Assert.AreNotEqual(0, result.Length);

            var xmlValidator     = new XmlValidator();
            var xsdSchemaFile    = "SolvePartialProblems.xsd";
            var xsdSchemaPath    = Path.Combine(_xsdSchemasPath, xsdSchemaFile);
            var validationResult = xmlValidator.Validate(result, xsdSchemaPath, true);
            var errorsCount      = validationResult.Errors.Count + validationResult.Warnings.Count;

            Assert.AreEqual(0, errorsCount);

            #region ExampleResult
            //<?xml version="1.0" encoding="utf-16"?>
            //<PartialProblems xmlns="http://www.mini.pw.edu.pl/ucc/">
            //  <ProblemType>Problem Type</ProblemType>
            //  <Id>123</Id>
            //  <CommonData>VGVzdCBCeXRlIEFycmF5</CommonData>
            //  <SolvingTimeout>122L</SolvingTimeout>
            //  <PartialProblems>
            //    <PartialProblem>
            //      <TaskId>123</TaskId>
            //      <Data>VGVzdCBCeXRlIEFycmF5</Data>
            //    </PartialProblem>
            //  </PartialProblems>
            //</PartialProblems>
            #endregion
        }
        public void SimpleProblemWithTwoClients()
        {
            PartialProblem pp = new PartialProblem
            {
                Id      = 1,
                SetId   = 1,
                Clients = new HashSet <Client>
                {
                    new Client
                    {
                        RequestSize = 5,
                        StartTime   = 14,
                        UnloadTime  = 1,
                        X           = 0,
                        Y           = 0
                    },
                    new Client
                    {
                        RequestSize = 5,
                        StartTime   = 14,
                        UnloadTime  = 1,
                        X           = 0,
                        Y           = 1
                    }
                }
            };
            Problem p = new Problem
            {
                VehiclesCapacity = 10,
                VehicleSpeed     = 1,
                Depots           = new HashSet <Depot>
                {
                    new Depot
                    {
                        StartTime = 12,
                        EndTime   = 20,
                        X         = 1,
                        Y         = 1
                    }
                }
            };
            var ret = problemSolver.SolvePartialProblem(pp, p);

            ret.Result.ShouldBe(2 + Math.Sqrt(2));
        }
        public void Parse_SolvePartialProblemMessage_XMLString()
        {
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"xml_samples\SolvePartialProblems.xml");

            string problemType = "TSP";
            ulong  id          = 12;

            byte[] commonData     = { 1, 23, 25, 2, 5, 5, 5, 5, 2, 26, 87 };
            ulong  solvingTimeout = 1000;

            // fields for PartialProblem1
            ulong taskId1 = 123;

            byte[]         data1           = { 24, 252, 6, 43, 57, 88 };
            ulong          nodeId1         = 1;
            PartialProblem partialProblem1 = new PartialProblem(taskId1, data1, nodeId1);

            // fields for PartialProblem2
            ulong taskId2 = 321;

            byte[]         data2           = { 24, 252, 6, 43, 57, 88 };
            ulong          nodeId2         = 2;
            PartialProblem partialProblem2 = new PartialProblem(taskId2, data2, nodeId2);

            PartialProblem[] partialProblems = { partialProblem1, partialProblem2 };

            SolvePartialProblemsMessage message = new SolvePartialProblemsMessage(problemType, id, commonData,
                                                                                  solvingTimeout, partialProblems);

            string actualXmlStr = message.ToXmlString();

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(path);
            string expectedXmlStr = xmlDoc.OuterXml;

            Assert.AreEqual(expectedXmlStr, actualXmlStr);
        }
예제 #13
0
        private void SolvePartialProblem(PartialProblemsHelper partialProblemsHelper, PartialProblem partialProblem)
        {
            var taskSolver = GetProperTaskSolver(partialProblemsHelper.ProblemType, partialProblem.Data);

            byte[] solution = taskSolver.Solve(partialProblem.Data, new TimeSpan(100000, 0, 0, 0)); //TODO: Ogarnac te timeouty


            bool     dziaa  = false;
            IOThread thread = null;

            while (!dziaa)
            {
                try
                {
                    thread       = _runningThreads.FirstOrDefault(x => x.TaskId == partialProblem.TaskId);
                    thread.State = EState.Idle;
                    dziaa        = true;
                }
                catch (Exception)
                {
                }
            }
            partialProblemsHelper.Solutions.Add(new Solution(partialProblem.TaskId, false, ESolutionType.Partial,
                                                             thread.HowLong, solution)); //TODO: Ogarnac te timeouty też

            if (partialProblemsHelper.Solutions.Count == partialProblemsHelper.Problems.Count)
            //Wszystkie rozwiazania policzone
            {
                SolutionsMessage solutionsMessage = new SolutionsMessage(partialProblemsHelper.ProblemType,
                                                                         partialProblemsHelper.ProblemId, partialProblemsHelper.Message.CommonData,
                                                                         partialProblemsHelper.Solutions);
                SendMessage(solutionsMessage.Serialize());
            }
            lock (_runningThreadsLockObject)
            {
                _runningThreads.Remove(thread);
            }
        }