动态规划分配工作的算法

时间:2011-01-25 11:52:57

标签: algorithm dynamic-programming

问题在于:

需要执行n个工作,每个工作都以增益{v1,v2,。 。 。 ,vn},它实现所需的时间{t1,t2,。 。 。 ,tn}及其实施的最后期限{d1,d2,。 。 。 ,dn< = d2< = .....< = d3。知道只有当工作在那个时间完成并且你有一台机器时才会发生增益。必须描述一种计算可以获得的最大增益的算法。

我曾想过一个带有两个参数的递推方程,一个指示第i个工作,另一个指示我们实施的时刻:OPT(i,d),如果d + t_i <= d则添加增益t_i。 (然后是多路选择的变体..这是1&lt; = i&lt; = n)的最小值。

我的主要问题是:如何找到以前执行的工作?我使用支持的数据结构?

你会写出复发的等式吗?

谢谢!!!!

3 个答案:

答案 0 :(得分:3)

我的主要问题是:我怎样才能找到以前开展的工作?我使用支持的数据结构?
诀窍是,您不需要知道已经完成了哪些工作。因为你可以按照增加截止日期的顺序执行它们。

假设一些最佳解决方案(产生最大利润)要求您完成工作A(截止日期10),然后工作B(截止日期3)。但在这种情况下,您可以安全地交换AB。它们仍将及时完成,新的安排将产生相同的总利润 结束证明。

你会写出复发方程式吗?
你已经有了一般的想法,但你不需要循环( min for 1&lt; = i&lt; = n )。

max_profit(current_job, start_time)
    // skip this job
    result1 = max_profit(current_job + 1, start_time)

    // start doing this job now
    finish_time = start_time + T[current_job]
    if finish_time <= D[current_job]
        // only if we can finish it before deadline
        result2 = max_profit(current_job + 1, finish_time) + V[current_job];
    end

    return max(result1, result2);
end

将其转换为DP应该是微不足道的。

如果您不希望O(n*max_deadline)复杂性(例如,当dt值很大时),您可以使用memoization进行递归并将结果存储在哈希表而不是二维数组。

修改
如果必须执行所有工作,但并非所有工作都要支付,则问题保持不变。只是将你没有时间的工作(截止日期前无法完成的工作)推到最后。就是这样。

答案 1 :(得分:0)

首先,我会选择产量最高的物品。意味着拥有的工作 价值/时间的最大比率可以匹配他们的截止日期(如果现在+ t1超过d1那么它是假的)。然后我检查现在+ job_time和每个截止日期之间的时间,获得每个工作的“完成”。将首先出现的工作将是收益率最高且完成机会最少的工作。这个想法是为了挤出最有价值的工作。 案例:

如果一个产量为5的作业需要10秒才能完成,它的截止时间是600秒,一个产量相同的作业需要20秒才能完成,它的截止时间是22秒,然后我运行第二个。

如果一个收益率为10的作业需要10秒才能完成,它的截止日期是100秒,而另一个作品的收益率为5需要10秒才能完成,而截止日期是100秒,我将运行第一个之一。

如果他们的收益率是相同的并且他们需要相同的时间来完成他们的截止日期是100秒,分别是101秒,我将运行第一个,因为它赢得更多的时间。

..等等......

这种情况下的递归仅指通过“Yield”和“Tonce to finish”按这些参数重新排序作业。

请记住在订单中插入作业后始终增加“now”(+ job_time)。 希望它能回答。

答案 2 :(得分:0)

我阅读了上面的评论,并了解到你并不是在寻找你正在寻找完成的效率,所以这样就可以避免产量,并且在截止日期前完成订购。这是经典的问题 Divide et Impera Quicksort http://en.wikipedia.org/wiki/Quicksort