贪心算法——作业调度问题
贪心算法:
•贪心算法是一种改进的分级处理方法
•它是根据题意,选取一种量度标准;然后按这个量度标准对这n个输入进行排序
•按序每次输入一个量,如果这个量和当前已构成的最优解S合并可以产生一个可行解,则将这个输入值加入S,否则就抛弃
抽象表示:
procedure GREEDY(A, n)
//A(0:n-1) n个已按某种标准排序
S <- Ø; //S为最优解,初始化为空
for i <- 0 to n-1 do
x <- A[i];
if FEASIBLE(S, x)
then S <- UNION(S, x)
endif
repeat
return S
end GREEDY
作业调度问题:
问题描述:
i |
1 |
2 |
3 |
4 |
5 |
d |
2 |
1 |
3 |
3 |
1 |
p |
20 |
30 |
40 |
50 |
20 |
•每个作业所需完成时间都是单位时间1
•i为作业编号,di为对应作业截止时间,pi为作业可带来的效益值
•这些作业的进行都需要使用同一台机器
•问:如何安排可以得到最优解(即得到的效益值最大)?
解答:
•先将所有的工作按照效益值进行排序
i |
4 |
3 |
2 |
1 |
5 |
d |
3 |
3 |
1 |
2 |
1 |
p |
50 |
40 |
30 |
20 |
20 |
•按照贪心算法来选择,出现一个问题
if FEASIBLE(S, x)
then S <- UNION(S, x)
endif
就是如何快速的判断新加入的元素是否满足我们的条件 FEASIBLE(S, x)
•此时我们再次运用一下贪心算法,对于还未分配处理时间的作业,尽可能推迟对该作业的处理
以下为运算过程:
1 |
2 |
3 |
4 |
5 |
i4 |
||||
i3 |
i4 |
|||
i2 |
i3 |
i4 |
||
i2 |
i3 |
i4 |
||
i2 |
i3 |
i4 |