在此Job Sequencing Problem中,我们如何证明贪婪方法将提供的解决方案是最佳解决方案?
此外,正如作者后来声称的那样,我也无法找出O(n)解决方案
可以通过使用联合查找数据结构将其优化为几乎O(n)。
贪婪解的最优性可以通过以下交换论点看出。在不失一般性的前提下,假设所有利润都是不同的,并且职位按利润的降序排列。
修复解决方案S
。从此解决方案中,删除所有错过截止日期的作业。通过此转换,每个工作都在其截止日期之前完成,因此得出的解决方案S1
仍然是最佳的。对于作业i
,请考虑间隔I_i:=[0,min(n,deadline(i))]
(如在贪婪算法中一样)。在此间隔内,在作业i
的右边,只有处理时间较长的作业(如果没有,则可能是我们的订单早考虑了这些作业,或者可以在不违反最后期限的情况下进行更换)。将作业i
放置在I_i
中可能的最右边位置。
总共,我们有以下语句。
每个解决方案S
可以转换为具有以下特性的解决方案S'
。
S'
包含S
的每个作业,该作业在截止日期之前完成。i
中的每个作业S
,i
中I_i
之后的所有作业都具有更长的处理时间。i
中的每个作业S
,在i
中的I_i
之后没有空闲时间。S'
具有与S
相同的目标值。特别是,存在具有上述特性的最优解S*
。令S
是由贪婪算法生成的算法。注意,S
也具有上面的属性2和3。令i
是在S
中发生的第一工作,但不在S*
中发生。令pos
为i
中S
的时隙。如果pos
中的S*
为空,则可以通过添加S*
来改进i
,这与S*
的最佳性相反。如果pos
中的S*
为空,则i'
中pos
中的S*
职位的利润不能大于i
,因为否则贪婪算法会选择i'
在pos
中的S
处。因此,它的利润必须低于i
。这意味着可以将其删除并替换为i
中的S*
,这也与S*
的最佳性相矛盾。