更确切地说,我正在编写一个程序来查找学生想要学习的课程的所有可能时间表。
假设学生想要 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>
是否有任何现有的算法策略?
谢谢!