问题描述:
有n tasks
,在这些任务中one might be dependent on the others
,这意味着如果A依赖于B,那么B必须在A完成之前完成。
1.找到一种尽快完成这些任务的方法?
2.if take parallelism into account
,如何设计程序来完成这些任务?
问题:
显然,第一个问题的答案是,对这些任务进行拓扑排序,然后按顺序完成。
但如果考虑到并行性,如何完成这项工作?
我的回答是,首先对这些任务进行拓扑排序,然后选择那些独立的任务并先完成它们,然后选择并完成其余的任务......
我是对的吗?
答案 0 :(得分:4)
拓扑排序算法可以为您提供各种不同的结果顺序,因此您不能只采用前几个元素并假设它们是独立的元素。
而不是拓扑排序我建议按入局依赖边的数量对任务进行排序。因此,例如,如果您的图表有A - > B,A - > C,B - > C,D - > C你可以将它排序为A [0],D [0],B [1],C [3]其中[i]是传入边的数量。
通过拓扑排序,您还可以获得A,B,D,C。在这种情况下,要发现可以并行执行A和D并不容易。
请注意,在完成任务处理后,您必须更新剩余的任务,特别是那些依赖于已完成任务的任务。但是,如果进入任务的依赖项数量限制在相对较小的数量(比如几百个),则可以轻松地依赖radix / bucket-sort之类的东西,并保持排序结构在恒定时间内更新。
通过这种方法,您可以在单个并行任务完成后轻松启动新任务。只需更新依赖项计数,然后启动现在有0个传入依赖项的所有任务。
请注意,此方法假定您具有足够的处理能力来处理同时没有依赖关系的所有任务。如果你的资源有限并且在处理时间方面需要关注最佳解决方案,那么你就必须投入更多精力,因为问题变得非常难以解决(如已经提到的那样)。
所以回答你原来的问题:是的,你基本上是正确的,但是,你没有解释如何有效地确定这些独立的任务(参见上面的例子)。
答案 1 :(得分:1)
我会尝试在有向的森林结构中对它们进行排序,任务执行时间为边缘权重。将树枝从最重到最轻,从最重的开始。使用这种方法,您可以同时检查循环依赖性。
使用并行性,你得到了bin难题,这是NP难的。尝试查找该问题的近似解决方案。
答案 2 :(得分:1)
查看来自Critical Path Method的project management的total slack。它基本上可以满足您的需求:给定具有依赖性和持续时间的任务,它会产生需要多长时间,以及何时激活每个任务。
(*)请注意,此技术假设无限数量的资源以实现最佳解决方案。对于有限的资源,有贪婪算法的启发式方法,例如:GPRW [当前+以下任务时间]或MSLK [最短{{3}}时间]。
(*)另请注意,它需要知道[或至少估计]每项任务需要多长时间。