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)); } } }
static void Main(string[] args) { //Dictionary<string, int> did = new Dictionary<string, int>(); //did.Add("sad", 11); //Console.WriteLine("d is " + did["sad"] + " and d1 is " + did["sad1"]); //int i = 1023; //int j = i / 100; //int k = i % 100; //Console.WriteLine("d is " + i / 100 + " and d1 is " + k); //string fileName = args[0]; string fileName = "G:\\Projects\\VS2012\\算例\\000.mp";//args[0]; RcpspSolver solve = new RcpspSolver(); solve = RcpspParser.parseMultiProjFile(fileName); allMIT(solve); return; //solve.TotalWuWeight = 30; ////产生所有可行划分和所有划分组合 solve.generateAllPossiblePartation(); ////计算所有组合的最优时间和最优分组 solve.calcAllCombMultiProcess(); 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(); } RcspspProject bestproj = solve.calAllPartitionScore(); Console.WriteLine("all project end time is "); foreach (RcspspProject proj in solve.ProjectList) { if (proj.Jobs.Count > 1) { RcpspJob lastJob = proj.Jobs.Last.Previous.Value; Console.Write(" " + (lastJob.startTime + lastJob.duration)); } } Console.WriteLine(); Console.WriteLine("best core is " + bestproj.BestSocre + " and partition is " + bestproj.BestCombStr); Console.Write("this List is : "); 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, true)); 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)); } } return; }
public static void generateProj(RcspspProject spspProject) { int[] resCap = { 3, 4, 2, 3, 6 }; for (int i = 0; i < 5; i++) { RcpspResource resource = new RcpspResource(); resource.max_capacity = resCap[i]; spspProject.Resources.AddLast(resource); } int numberJobs = 22; int[] durations = { 0, 10, 8, 20, 4, 8, 4, 10, 6, 12, 5, 22, 13, 4, 10, 8, 2, 16, 25, 8, 2, 0 }; int[,] resUsed = { { 0, 0, 0, 0, 0 }, //0 { 2, 0, 2, 1, 0 }, //1 { 0, 1, 0, 2, 5 }, //2 { 1, 0, 2, 0, 0 }, //3 { 0, 0, 0, 3, 5 }, //4 { 0, 2, 0, 0, 2 }, //5 { 0, 2, 1, 0, 0 }, //6 { 2, 0, 2, 0, 0 }, //7 { 1, 0, 0, 2, 5 }, //8 { 0, 1, 0, 0, 2 }, //9 { 0, 0, 0, 3, 0 }, //10 { 1, 0, 0, 0, 0 }, //11 { 2, 2, 0, 0, 0 }, //12 { 0, 0, 2, 3, 0 }, //13 { 0, 0, 0, 1, 4 }, //14 { 1, 0, 0, 1, 3 }, //15 { 0, 0, 0, 1, 2 }, //16 { 2, 3, 0, 0, 0 }, //17 { 1, 0, 2, 0, 0 }, //18 { 0, 2, 0, 3, 0 }, //19 { 0, 3, 0, 0, 6 }, //20 { 0, 0, 0, 0, 0 } //21 }; int [][] pp = new int[22][]; pp[0] = new int[] { 0 }; //1 pp[1] = new int[] { 0 }; //2 pp[2] = new int[] { 1 }; //3 pp[3] = new int[] { 0 }; //4 pp[4] = new int[] { 3 }; //5 pp[5] = new int[] { 2, 4 }; //6 pp[6] = new int[] { 0 }; //7 pp[7] = new int[] { 6 }; //8 pp[8] = new int[] { 7 }; //9 pp[9] = new int[] { 7 }; //10 pp[10] = new int[] { 8, 9 }; //11 pp[11] = new int[] { 0 }; //12 pp[12] = new int[] { 11 }; //13 pp[13] = new int[] { 11 }; //14 pp[14] = new int[] { 12, 13 }; //15 pp[15] = new int[] { 14 }; //16 pp[16] = new int[] { 0 }; //17 pp[17] = new int[] { 16 }; //18 pp[18] = new int[] { 0 }; //19 pp[19] = new int[] { 17, 18 }; //20 pp[20] = new int[] { 19 }; //21 pp[21] = new int[] { 5, 10, 15, 20 }; //22 for (int j = 0; j < numberJobs; j++) { RcpspJob job = new RcpspJob(); job.id = Convert.ToString(j); job.duration = durations[j]; for (int resN = 0; resN < 5; resN++) { if (resUsed[j, resN] > 0) { job.addResourceDemand(spspProject.Resources.ElementAt(resN), resUsed[j, resN]); } } for (int preIndex = 0; preIndex < pp[j].Length; preIndex++) { if (pp[j][preIndex] != j) { job.addPredecessor(spspProject.Jobs.ElementAt(pp[j][preIndex])); } } spspProject.Jobs.AddLast(job); } }
public static void generateRandomProj(RcspspProject spspProject) { Random rd = new Random(); for (int i = 0; i < 5; i++) { RcpspResource resource = new RcpspResource(); resource.max_capacity = rd.Next(1, 10); spspProject.Resources.AddLast(resource); } RcpspJob zeroJob = new RcpspJob(); zeroJob.duration = 0; zeroJob.id = "0"; spspProject.Jobs.AddLast(zeroJob); //初始Job,每一个job都有不允许建立的关系,即前置已经建立的关系,存放起来Dictionary<Job,Job>存在 LinkedList <Edge> existEdges = new LinkedList <Edge>(); int numberJobs = 5; int durationMax = 11; for (int j = 1; j < numberJobs + 1; j++) { RcpspJob job = new RcpspJob(); job.id = Convert.ToString(j); //检查可以生成的边的数量 int edgeCount = 0; LinkedListNode <RcpspJob> node = spspProject.Jobs.First; while (node != null) { //检测是否不允许 bool isAllow = true; //遍历列表 foreach (Edge ed in existEdges) { if (ed.from == job && ed.to == node.Value) { isAllow = false; break; } } if (!isAllow) { continue; } //是否生成 if (rd.Next(0, 2) > 0) { edgeCount++; job.addPredecessor(node.Value); Edge edThis = new Edge(); edThis.from = job; edThis.to = node.Value; existEdges.AddLast(edThis); //将前置的所有不允许加入当前的 LinkedListNode <Edge> lastNode = existEdges.Last; while (lastNode != null) { Edge ed = lastNode.Value; if (ed.from == node.Value) { Edge edNew = new Edge(); edNew.from = job; edNew.to = ed.to; existEdges.AddLast(edNew); } lastNode = lastNode.Previous; } } node = node.Next; } if (edgeCount == 0) { job.addPredecessor(spspProject.Jobs.First.Value); existEdges.AddLast(new Edge(job, spspProject.Jobs.First.Value)); } if (j == numberJobs - 1) { job.duration = 0; } else { job.duration = rd.Next(1, durationMax); //随机资源使用 for (int i = 0; i < 5; i++) { RcpspResource resource = spspProject.Resources.ElementAt(i); int resourceDemand = rd.Next(0, resource.max_capacity + 1); if (resourceDemand > 0) { job.addResourceDemand(resource, resourceDemand); } } } spspProject.Jobs.AddLast(job); } //添加最后工序 RcpspJob lastJob = new RcpspJob(); lastJob.duration = 0; lastJob.id = Convert.ToString(numberJobs + 1); //所有没有紧后任务的工序都设一条到该点的边 for (LinkedListNode <RcpspJob> recuNode = spspProject.Jobs.First; recuNode != null; recuNode = recuNode.Next) { if (recuNode.Value.successors.Count <= 0) { lastJob.addPredecessor(recuNode.Value); } } spspProject.Jobs.AddLast(lastJob); }
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); }
private ProjectManager GetResultOfMultiFile(string fileName) { ProjectManager manager = new ProjectManager(); RcpspSolver solve = new RcpspSolver(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); solve = RcpspParser.parseMultiProjFile(fileName); stopWatch.Stop(); long parseTime = stopWatch.ElapsedMilliseconds; stopWatch.Reset(); stopWatch.Start(); ////产生所有可行划分和所有划分组合 solve.generateAllPossiblePartation(); ////计算所有组合的最优时间和最优分组 solve.calcAllCombMultiProcess(); RcspspProject bestproj = solve.calAllPartitionScore(); stopWatch.Stop(); long calcTime = stopWatch.ElapsedMilliseconds; 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); //遍历建立关系 //foreach (RcpspJob predwxJob in wxJob.predecessors) { // //处理紧前关系,建立连接关系 // if (predwxJob.isVirtual) continue; // if (job2Task.Keys.Contains(predwxJob)) // //manager.Relate(job2Task[predwxJob], wxTask); //} } } } } MessageBox.Show("最高得分:" + bestproj.BestSocre + ",文件解析耗时:" + parseTime + "ms,计算耗时:" + calcTime + "ms,最大并发数量:" + System.Threading.Tasks.TaskScheduler.Default.MaximumConcurrencyLevel, "Gantt Chart", MessageBoxButtons.OK, MessageBoxIcon.Information); return(manager); }