贪婪解决工作排序的最佳性证明

时间:2015-01-13 11:59:26

标签: algorithm job-scheduling greedy

在这个Job Sequencing Problem中,我们如何证明贪婪方法提供的解决方案是最优的?

此外,我也无法找出作者后来声称的O(n)解决方案

  

通过使用union-find数据结构可以将其优化为几乎O(n)。

4 个答案:

答案 0 :(得分:2)

贪婪解决方案的最优性可以通过交换论证看出如下。不失一般性,假设所有利润都不同,并且工作按利润递减顺序排序。

修复解决方案S。从这个解决方案中,删除每个错过最后期限的工作。 通过此转换,每个作业在截止日期之前完成,所得到的解决方案S1仍然是最佳的。对于作业i,请考虑间隔I_i:=[0,min(n,deadline(i))](如贪婪算法中所示)。在此区间中,在作业i的右侧,只有处理时间较长的作业(如果没有,它们要么在我们的订单之前被考虑过,要么可以在违反最后期限的情况下进行交换)。将作业i放在I_i中可能的最右侧位置。

总的来说,我们有以下声明。

每个解决方案S都可以转换为具有以下特性的解决方案S'

  1. S'包含S在截止日期前完成的所有工作。
  2. 对于i中的每个作业Si I_i之后的所有作业都有更长的处理时间。
  3. 对于i中的每个作业Si中的I_i之后没有空闲时间。
  4. S'S具有相同的目标价值。
  5. 特别是,存在具有上述属性的最佳解S*。设S为贪婪算法生成的算法。请注意,S还具有上面的属性2和3。让i成为S中的第一个作业,而不是S*中的作业。让pos成为iS的时段。如果posS*为空,则可以通过添加S*来改进i,这与S*的最优性相矛盾。如果pos中的S* 为空,则i'pos处的作业S*的利润不会超过i 1}},否则贪婪算法会选择i'pos S。因此,它的利润必须低于i。这意味着可以将其删除并替换为i中的S*,这也与S*的最优性相矛盾。

答案 1 :(得分:1)

  1. 正确性证明。让我们假设它不正确。这是什么意思?这意味着在某个步骤我们已经抛弃了一份工作,因为如果不删除已经取得的工作就无法添加它。如果我们删除了已经占用的一个并将当前的一个放入其时间段,我们就不会为下一个作业改变任何东西(占用时隙的集合将是相同的)。但总利润会减少。因此,该算法产生的解决方案是最优的。

  2. O(n ^ 2)更快。要做到这一点,我们需要从给定的一个快速找到最左边的自由位置。如果我们使用union-find结构来维护一组占用位置,我们可以找到当前作业的截止日期所在的组以及位于其左侧的take元素。但由于排序,它仍然是O(n log n)

答案 2 :(得分:0)

考虑一个价值2分的截止日期4和3个职位,每个职位1分,截止日期为3.这个反驳"贪婪"算法:在更昂贵的工作之前,先做三个更便宜的工作更有利可图。

至于O(n ^ 2)与O(n),我认为这两种说法都是错误的。 "贪心"如上所述,算法包括对作业进行排序 - O(nlogn) - 加上对排序列表的单次扫描,填充解决方案序列时隙 - O(n) - 并因此为O(nlogn)。

为了使其成为线性,人们必须做一些关于排序的事情,例如使用基数排序,这可以被认为是线性的,用于实际目的。

答案 3 :(得分:0)

给定的证明不完整。即,句子“我在S *中的职位不能获得比我更大的利润”的说法尚未得到证实,我认为不可能。无论如何,即使工作i的利润大于或等于i”,也可以证明该语句成立。

有关完整的证明,请参见http://ggn.dronacharya.info/CSEDept/Downloads/QuestionBank/Even/VI%20sem/ADA/Section-B/job-scheduling1.pdf