证明贪婪算法的最优性

时间:2015-03-30 15:56:30

标签: algorithm pseudocode greedy proof

我遇到的问题如下:

我们有n个任务,其中l_iw_i是任务i的完成时间和权重。提出一种最小化sum for all i of f_i * w_i的算法,其中f_i是任务i完成时的时间。例如,如果某个任务i先安排f_i = t_i,然后安排第二个f_i = t_i + t_(first task)

我花了一些时间在这上面,我首先想到的是,通过选择从最高权重到最低权重的任务来简单地创建任务列表就足够了,但是意识到这是错误的,例如,如果我们有2个任务:

1个任务:w_i = 10, l_i = 100

2任务:w_i = 9, l_i = 1

如果我们先用w_i 10选择那个,那么我们会得到10 * 100 + 9 * 101 = 1909但是如果我们选择第二个,我们会得到9 * 1 + 10 * 101 = 1019。

现在我认为最佳算法是从w_i / l_i的最高比率调度任务到最低算法,但我不知道如何证明它。任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您应该能够证明,如果没有按照您的建议安排任务,您可以通过交换错误顺序的两个相邻任务来改进计划。如果你减去这两种情况的总加权完成时间,你应该最终看一个表达式,看看加权完成时间的差异,如

L1W1 +(L1 + L2)W2 - [L2W2 +(L2 + L1)W1]并发现如果L1 / W1和L2 / W2在错误的方向上进行比较,则通过反转顺序获得。

答案 1 :(得分:1)

你是对的,任务应该按照w_i/L_i的递减顺序安排。 检查Tim Roughgarden教授给出的正确性证明的解释 Part 1 part 2