您有n个任务,执行时间取决于之前完成的任务。如果某些任务尚未完成,则任务的执行时间可能会缩短。创建能够在最短的时间内找到最佳任务顺序的算法。
E.g。
n = 3的
任务A,B,C
T(A | B,C)=执行任务的时间A给定B,C早先完成
T(A |)=执行任务A的时间作为第一个任务
T(A |)= 50
T(A | B)= 40
T(A | C)= 40
T(A | B,C)= 30
T(B |)= 30
T(B | A)= 25
T(B | C)= 20
T(B | A,C)= 15
T(C |)= 20
T(C | A)= 15
T(C | B)= 10
T(C | A,B)= 10
任何提示? 我在考虑Dijkstra算法,但在这种情况下似乎没有工作。
任何帮助表示感谢。
答案 0 :(得分:1)
让我们使用已知起始顶点A
的最小Hamiltonian path problem并为此任务顺序问题创建输入数据。
T(A|) = 0
T(i|) = inf, for any i ≠ A
T(i|j) = edge_weight(i, j), for any i,j
如果我们能够解决这个任务顺序问题,我们就可以解决NP-hard的最小哈密顿路径问题。因此,没有已知的算法在多项式时间内解决该问题。
现在让我们为相对较小的n
解决这个问题。在任务执行的每一步中,我们都有一组已经完成的任务S
(它在开头是空的)。然后我们可以执行下一个任务,选择数据中的最佳可用时间,将其添加到集合S
并转到下一步。这自然带来了状态S
的动态编程方法 - 一组已经完成的任务(这可以用位掩码实现):
其中minTime(S, i)
是任务i
的最小执行时间,此时集S
中的所有任务都已执行。