Пример #1
0
        public static void allMIT(RcpspSolver solve)
        {
            solve.generateAllPossiblePartation();
            string comb1 = "(1,2,5)";
            string comb2 = "(4)";
            string comb3 = "(3)";

            solve.EveryCombBestProj[comb1] = RcpspSolver.calCombBestScoreByTabuSearch(comb1, solve.EveryComb[comb1], true);
            solve.EveryCombBestProj[comb2] = RcpspSolver.calCombBestScoreByTabuSearch(comb2, solve.EveryComb[comb2], true);
            solve.EveryCombBestProj[comb3] = RcpspSolver.calCombBestScoreByTabuSearch(comb3, solve.EveryComb[comb3], true);
            foreach (string str in solve.EveryCombBestProj.Keys)
            {
                RcspspProject proj = solve.EveryCombBestProj[str];
                Console.WriteLine("comb core " + str + "is " + proj.BestSocre + " and list is : ");
                Console.Write("             ");
                foreach (RcpspJob job in proj.Jobs)
                {
                    Console.Write("(" + job.id + "__" + job.project + "__" + job.duration + ")");
                }
                Console.WriteLine();
            }
            List <List <RcspspProject> > projectPartition = new List <List <RcspspProject> >();

            projectPartition.Add(solve.EveryComb[comb1]);
            projectPartition.Add(solve.EveryComb[comb2]);
            projectPartition.Add(solve.EveryComb[comb3]);
            RcspspProject bestproj = RcpspSolver.calPartitionBestScoreByTabuSearch(projectPartition, solve.EveryCombBestProj, true);

            Console.WriteLine("best core is " + bestproj.BestSocre + " and partition is " + bestproj.BestCombStr);
            foreach (RcpspJob job in bestproj.Jobs)
            {
                //Console.Write("[" + job.id + "__" + job.project + "__" + job.startTime+"__"+job.duration + "]");
                if (job.isWX)
                {
                    RcspspProject wxProject = solve.EveryCombBestProj[job.project];
                    foreach (RcpspJob wxJob in wxProject.Jobs)
                    {
                        addJob2Dic(solve.ProjectList, wxJob, job.startTime);
                    }
                }
                else
                {
                    addJob2Dic(solve.ProjectList, job);
                }
            }
            //TabuSearch.printGUI(bestproj.Jobs);
            Console.WriteLine("total time is " + TabuSearch.calScheduleCore(bestproj.Jobs, false));
            foreach (RcspspProject proj in solve.ProjectList)
            {
                Console.WriteLine("Project " + proj.ProjectId);
                foreach (RcpspJob projJob in proj.Jobs)
                {
                    Console.WriteLine(projJob.id + "\t" + projJob.startTime + "\t" + (projJob.startTime + projJob.duration));
                }
            }
        }
Пример #2
0
        private ProjectManager GetMITResultOfMultiFile(string fileName)
        {
            ProjectManager manager = new ProjectManager();
            RcpspSolver    solve   = new RcpspSolver();

            solve = RcpspParser.parseMultiProjFile(fileName);
            ////产生所有可行划分和所有划分组合
            solve.generateAllPossiblePartation();
            string comb1 = "(1,2,5)";
            string comb2 = "(4)";
            string comb3 = "(3)";

            solve.EveryCombBestProj[comb1] = RcpspSolver.calCombBestScoreByTabuSearch(comb1, solve.EveryComb[comb1], true);
            solve.EveryCombBestProj[comb2] = RcpspSolver.calCombBestScoreByTabuSearch(comb2, solve.EveryComb[comb2], true);
            solve.EveryCombBestProj[comb3] = RcpspSolver.calCombBestScoreByTabuSearch(comb3, solve.EveryComb[comb3], true);
            //foreach (string str in solve.EveryCombBestProj.Keys)
            //{
            //    RcspspProject proj = solve.EveryCombBestProj[str];
            //    Console.WriteLine("comb core " + str + "is " + proj.BestSocre + " and list is : ");
            //    Console.Write("             ");
            //    foreach (RcpspJob job in proj.Jobs)
            //    {
            //        Console.Write("(" + job.id + "__" + job.project + "__" + job.duration + ")");
            //    }
            //    Console.WriteLine();
            //}
            List <List <RcspspProject> > projectPartition = new List <List <RcspspProject> >();

            projectPartition.Add(solve.EveryComb[comb1]);
            projectPartition.Add(solve.EveryComb[comb2]);
            projectPartition.Add(solve.EveryComb[comb3]);
            RcspspProject bestproj = RcpspSolver.calPartitionBestScoreByTabuSearch(projectPartition, solve.EveryCombBestProj, true);

            //Console.WriteLine("best core is " + bestproj.BestSocre + " and partition is " + bestproj.BestCombStr);
            //foreach (RcpspJob job in bestproj.Jobs)
            //{
            //    //Console.Write("[" + job.id + "__" + job.project + "__" + job.startTime+"__"+job.duration + "]");
            //    if (job.isWX)
            //    {
            //        RcspspProject wxProject = solve.EveryCombBestProj[job.project];
            //        foreach (RcpspJob wxJob in wxProject.Jobs)
            //        {
            //            addJob2Dic(solve.ProjectList, wxJob, job.startTime);
            //        }
            //    }
            //    else
            //    {
            //        addJob2Dic(solve.ProjectList, job);
            //    }
            //}
            ////TabuSearch.printGUI(bestproj.Jobs);
            //Console.WriteLine("total time is " + TabuSearch.calScheduleCore(bestproj.Jobs, false));
            //foreach (RcspspProject proj in solve.ProjectList)
            //{
            //    Console.WriteLine("Project " + proj.ProjectId);
            //    foreach (RcpspJob projJob in proj.Jobs)
            //    {
            //        Console.WriteLine(projJob.id + "\t" + projJob.startTime + "\t" + (projJob.startTime + projJob.duration));
            //    }
            //}
            //RcspspProject bestproj = solve.calAllPartitionScore();
            if (bestproj == null)
            {
                return(null);
            }
            else
            {
                //构造manager
                Dictionary <RcpspJob, Task> job2Task = new Dictionary <RcpspJob, Task>();
                foreach (RcpspJob job in bestproj.Jobs)
                {
                    if (job.isVirtual)
                    {
                        continue;
                    }
                    Task task = new Task();
                    if (job.isWX)
                    {
                        task.Name = "****Project " + job.project + " Duration:" + job.duration;
                    }
                    else
                    {
                        task.Name = "(Project:" + job.project + ",Job:" + (Convert.ToInt32(job.id) - 1) + ",Duration:" + job.duration + ")";
                    }
                    manager.Add(task);
                    manager.SetDuration(task, Convert.ToInt32(job.duration));
                    manager.SetStart(task, Convert.ToInt32(job.startTime));
                    job2Task.Add(job, task);
                    //foreach (RcpspJob predJob in job.predecessors) {
                    //    //处理紧前关系,建立连接关系
                    //    if (predJob.isVirtual) continue;
                    //    if (job2Task.Keys.Contains(predJob))
                    //        manager.Relate(job2Task[predJob],task);
                    //}
                    //处理坞修内任务,形成一个group
                    if (job.isWX)
                    {
                        double iStartTime = job.startTime;
                        manager.SetComplete(task, 1);
                        LinkedList <RcpspJob> wxJobs = solve.EveryCombBestProj[job.project].Jobs;
                        foreach (RcpspJob wxJob in wxJobs)
                        {
                            if (wxJob.isVirtual)
                            {
                                continue;
                            }
                            Task wxTask = new Task();
                            wxTask.Name = "(Project:" + wxJob.project + ",Job:" + (Convert.ToInt32(wxJob.id) - 1) + ",Duration:" + wxJob.duration + ")";
                            job2Task.Add(wxJob, wxTask);
                            manager.Add(wxTask);
                            manager.Group(task, wxTask);
                            manager.SetDuration(wxTask, Convert.ToInt32(wxJob.duration));
                            manager.SetStart(wxTask, Convert.ToInt32(wxJob.startTime + iStartTime));
                            manager.SetComplete(wxTask, 1);
                        }
                    }
                }
            }
            return(manager);
        }