以并行方式查找排列

时间:2014-04-09 21:12:16

标签: c# algorithm parallel-processing task-parallel-library permutation

如何编写一个程序以并行方式查找序列的所有排列?

更确切地说,我正在编写一个程序来查找学生想要学习的课程的所有可能时间表。

假设学生想要 CC101 CC102

有3名教师正在教授 CC101 (CC101.A,CC101.B,...)和2教授 CC102

组合将是

[CC101.A, CC102.A]
[CC101.A, CC102.B]
[CC101.B, CC102.A]
[...]
[CC101.C, CC102.B]

(当然,解雇那些班级碰撞/同时发生的事情)。

我目前处理此问题的方式是使用递归函数,基本上如下所示:

private List<Schedule> Schedules {get; set;}
public FindSchedules(Course[] courses)
{
   FindSchedules(new sched(), courses, 0);
   return this.Schedules;
}

private void FindSchedules(Schedule sched, Course[] courses, int courseIndex)
{
   if(i>= courses.length)
   {
      //class property
      this.Schedules.Add(sched.Clone());
   }
   foreach(var class in Courses[courseIndex].Classes)
   { 
     if(sched.ConflictsWith(class) continue;

     sched.Add(class);
     FindSchedules(sched, courses, courseIndex +1)
     sched.remove(class);
   }   
}

这实际上效果很好,但对于拥有大量课程的大量课程,它可以开始建立。 (可能的组合数是课程[0] .Classes.Count * Courses [1] .Classes.Count * ... * Courses [N] .Classes.Count)

我想知道的是,是否有办法让它并行工作。我原以为我可能会做Task.Run(()=>FindSchedules(sched.Clone(), courses, courseIndex +1));,但显然我不想做所有这样的调用,只是前几个调用,然后他们的子调用是常规的递归调用。 / p>

是否有任何现有的算法策略?

谢谢!