任务安排问题
问题描述
活动的定义
- 设S={1,2,…,n}是n个活动的集合,各个活动使用同一个资源,资源在同一时间只能为一个活动使用。
- 每个活动i有起始时间si,终止时间fi,si ≤ fi。
- 活动i和j是相容的,若sj ≤ fi或si ≤ fj。
输入:S={1, 2, …, n},F={ [si,fi] },n ≤ i ≤ 1
输出:S的最大相容集合
算法描述
1. 确定贪心思想
为了可以使得更多的相容活动被包含,每次选fi最小的活动,使得我们能够选择更多的活动。
2. 分析贪心选择性
引理1:设:S={1,2,…,n}是n个活动的集合,[s,fi]是活动i的起始终止时间,且f1≤f2≤….≤fn,那么,S的任务安排问题的某个优化解包括活动1.
证明:设A是一个优化解,按结束时间排序A中活动, 设其第一个活动为k,第二个活动为j.
- 如果k=1,引理成立.
- 如果k≠1,令 B=A-{k}∪{1}, 由于A中活动相容,f1 ≤ fk , B中活动相容. 因为|B|=|A|, 所以B是一个优化解,且包括活动1.
3.分析优化子结构
引理2:设:S={1, 2, …, n}是n个活动集合,[si,fi]是活动i的起始终止时间,且f1≤f2≤….≤fn ,设A是S的任务安排问题的一个优化解且包括活动1,则A'=A-{1} 是S'={ i 属于 S|si≥f1 }的调度问题的优化解.
证明:显然,A'是相容的,仅仅需要证明A'是S'任务安排问题的解决方案中最大的解就可以。
如若不然,则存在一个S'任务安排问题的最优解B',而S'中的所有活动均与活动1进行相容,那么可以构造B ={1}UB',而B是S问题的解,且|B|>|A|,那么A就不是S问题的最优解,矛盾。故而A’是S‘任务安排问题的解决方案中最大解。
4.分析算法正确性
设:S={1, 2, …., n} 是 n 个活动集合,f0 = 0, li是 Si ={ j属于S | sj ≥ f i-1} 中具有最小结束时间的活动.设A是S的包含活动1的优化解, 其中 f1≤ …≤fn ,则 A = U(i=1 : k) {li}。
证明:
5.设计算法
根据贪心思想设计算法。
设f1≤f2≤….≤fn已排序)
Greedy-Activity-Selector(S, F)
n = lenyth(S);
A = {1}
j = 1
For i=2 To n Do
If si >= fj
Then A = A∪{i};
j = i;
Return A
6.算法复杂性分析:
时间复杂性:
如果结束时间已经排序,那么T(n) = O(n)
如果结束时间已经排序,那么T(n) = O(n) + O(nlogn) = O(nlogn)