コード例 #1
0
ファイル: TaskManager.cs プロジェクト: Bajena/IO2
        private void DivideProblem(DivideProblemMessage msg, TaskSolver taskSolver)
        {
            var partialProblemsData = taskSolver.DivideProblem((int)msg.ComputationalNodes);
            var messagesList        = new List <SolvePartialProblemsMessage>();

            for (int i = partialProblemsData.Length - 1; i >= 0; i -= PartialProblemsPackageSize)
            {
                var packageSize            = i + 1 < PartialProblemsPackageSize ? i + 1 : PartialProblemsPackageSize;
                var partialProblemsPackage = new byte[packageSize][];
                for (int j = 0; j < packageSize; j++)
                {
                    partialProblemsPackage[j] = partialProblemsData[i - j];
                }
                var partialProblemsObjects = new List <PartialProblem>();
                foreach (var partialData in partialProblemsPackage)
                {
                    partialProblemsObjects.Add(new PartialProblem()
                    {
                        Data   = partialData,
                        TaskId = ++_maxTaskId
                    });
                }
                _problems[msg.Id].PartialProblems.AddRange(partialProblemsObjects);
                //TODO: NA PEWNO NIE MILIJON TAJMAŁTUW
                var partialProblemsMsg = new SolvePartialProblemsMessage(msg.ProblemType, msg.Id, new byte[0], 100000000, partialProblemsObjects);
                messagesList.Add(partialProblemsMsg);
            }

            foreach (var partialProblemsMessage in messagesList)
            {
                var serialized = partialProblemsMessage.Serialize();
                SendMessage(serialized);
            }

            var thread = GetThreadByProblemInstanceId(msg.Id);

            thread.State = EState.Idle;
        }
コード例 #2
0
        private void SendPartialProblems(ulong id)
        {
            try
            {
                taskSolver = new DVRPTaskSolver(problem.Data);
                var dividedProblems = taskSolver.DivideProblem((int) problem.ComputationalNodes);
                var solvePartialProblemsPartialProblem = new SolvePartialProblemsPartialProblem[dividedProblems.Length];
                for (int i = 0; i < dividedProblems.Length; i++)
                {
                    solvePartialProblemsPartialProblem[i] = new SolvePartialProblemsPartialProblem {Data = dividedProblems[i], TaskId = ++taskId};
                }

                var partialProblems = new SolvePartialProblems
                {
                    CommonData = problem.Data,
                    Id = id,
                    ProblemType = "DVRP",
                    PartialProblems = solvePartialProblemsPartialProblem,
                    SolvingTimeout = 100000,
                    SolvingTimeoutSpecified = true
                };
                networkAdapter.Send(partialProblems, true);
                Console.WriteLine("SendSolvePartialProblems");
            }
            catch (Exception e)
            {
                Console.WriteLine("Cannot send partial problems to server: " + e.Message);
            }
        }
コード例 #3
0
        private void DivideProblem(DivideProblem _problem)
        {
            bool isEnd = false;

            /*   var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
             * List<string> loadedP=new List<string>();
             * foreach (var asembly in loadedAssemblies)
             * {
             *     try
             *     {
             *         string s = asembly.Location;
             *         loadedP.Add(s);
             *     }
             *     catch (Exception) { }
             * }
             *
             *
             * var loadedPaths = loadedP.ToArray();
             * var referencedPaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll");
             * var toLoad = referencedPaths.Where(r => !loadedPaths.Contains(r, StringComparer.InvariantCultureIgnoreCase)).ToList();
             * toLoad.ForEach(path => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(path))));*/
            List <Assembly> list   = AppDomain.CurrentDomain.GetAssemblies().ToList();
            Type            myType = null;

            foreach (var asem in list)
            {
                foreach (var type in asem.GetTypes())
                {
                    if (type.BaseType == typeof(TaskSolver))
                    {
                        TaskSolver solv = (TaskSolver)Activator.CreateInstance(type, new byte[0]);
                        if (solv.Name == _problem.ProblemType)
                        {
                            myType = type; isEnd = true; break;
                        }
                    }
                }
                if (isEnd)
                {
                    break;
                }
            }

            taskSolver = (UCCTaskSolver.TaskSolver)Activator.CreateInstance(myType, _problem.Data);
            byte[][] partials = taskSolver.DivideProblem((int)_problem.ComputationalNodes);

            SendPartialProblem(_problem, partials);
            m_lockStatus.WaitOne();
            m_lastChangeTime    = DateTime.Now;
            m_status.Threads[0] = new StatusThread()
            {
                State   = StatusThreadState.Idle,
                HowLong = 0,
                ProblemInstanceIdSpecified = false,
                ProblemType     = "",
                TaskIdSpecified = false
            };
            m_lockStatus.Release();

            //List<List<List<List<int>>>> permutationForNodes = new List<List<List<List<int>>>>();
            //for (int i = 0; i < (int)_problem.ComputationalNodes; i++)
            //    permutationForNodes.Add(new List<List<List<int>>>());
            //int ind = 0;
            //foreach (var set in allDevisions)
            // {
            //     permutationForNodes[ind].Add(set);
            //     ind = (ind + 1) % (int)_problem.ComputationalNodes;
            // }
            // SendPartialProblem(_problem, permutationForNodes);
        }