贪心法解活动安排问题
[问题]设有n个活动的集合E={1,2,……,n}(按其结束时间排序),其中每个活动都要使用同一个场所,而在同一时间内只有1个活动能使用该场所。每个活动i的开始时间和结束时间分别为begin[i]和finish[i]。求E的最大相容子集合。
[解析]先选择活动1,活动1具有最早的完成时间。下面证明该问题具有贪心选择性质,即该问题有一个最优解以贪心选择开始,即该最优解中包含活动1。证明过程如下:
设子集A是该问题的一个最优解,且A中的活动按结束时间排序,其第一个活动为k:
(1)若k=1,则A就是以贪心选择开始的最优解。
(2)若k>1,则设子集B=A-{k}U{1}。由于finish[1]≤finish[k],且A中的活动是相容的,所以B中的活动也是相容的。又由于B中活动的个数与A中相同,且A是最优的,所以B也是最优的。所以B是以贪心选择1开始的最优解。
综上所述,总是存在以贪心选择开始的最优解。该问题具有贪心选择性质。
在做出了贪心选择,即选择了活动1之后,原问题简化为对E中所有与1相容的活动进行活动安排的子问题。也就是说,如果A是原问题的最优解,则其子集C=A-{1}是该子问题的最优解(由反证法易得,假设该子问题存在一个活动数比C更多的解D,则{1}+D是原问题的一个最优解,且其活动数比A多,得出矛盾)。所以该问题具有最优子结构性质。我们只要求出该子问题的最优解F,则{1}+F就是原问题的一个最优解。因此,每一步做出的贪心选择都将原问题归纳为一个更小的且与原问题具有相同形式的子问题。
我们的贪心策略是每次总是选择具有最早完成时间的相容活动i加入最优解集合中。直观上,这将为未安排活动留下尽可能多的时间。也就是说,该贪心选择策略的意义是使剩余的可安排时间段最大化,以便安排尽可能多的相容活动。
也可以换一种贪心策略,不是选择第一个结束的活动,而是选择最后一个开始、且与之前选择的活动相兼容的活动。