【说人话的算法小课堂】贪心法-活动安排问题(正确性证明)

在这里插入图片描述另一证法
a_k 代表第 k 个活动,s_k 和 f_k 代表活动 k 的开始时间和结束时间。
在这里插入图片描述

活动安排问题
设有n个活动,编号分别为1,…,n。每个活动进行期间都始终需要占用某个物品(资源)。
活动k的起始和结束时间分别为b_k,e_k,它们均为非负整数。
一旦活动开始,就不允许被中断,直至活动结束。
要求给出活动安排方案,使得能进行的活动数量最多。如果有多个最优解,输出任意一个。
解法
【1】将各个活动{a_n }按结束时间升序排序。
【2】设E为已选取的最后一个活动的结束时间,其初值为E=0。
【3】从排序后的第一个活动开始,循环如下部分:
对第i个活动:
【3.1】如果该活动的开始时间b_i<E,则其时间与已选活动冲突,不选取。
【3.2】如果该活动的开始时间b_i≥E,则选择该活动,更新E=e_i。
证明
此方法属于贪心。
设未考察的活动为A^’={a_m,a_(m+1),…,a_n },m=1,2,…,n。随着上述算法的运行,将逐渐构造出一个解X。即证:
若要使X为最优解,则下一个选择的活动必为a_k,其中m≤k≤n,a_k代表与其结束时间相同的若干个活动中的一个,且其进行时间与已选活动都不冲突,结束时间亦尽可能早。
采用反证法证明。如果不选a_k,则:
【1】比a_k更早结束的活动无法选择,因为与已选活动的时间有冲突。
【2】比a_k更晚结束的活动a_l可以选择。但是:
设X’为从解X中【排除了a_l之前(不包括a_l)的已选活动】的集合,则随着a_l的结束时间变得更晚,|X’ |将递减。为了尽可能多地安排活动,即令X为最优解,则只能选择a_k。

容易发现:使用该算法得到的最优解总是会选中活动a_1,因为a_1为第一个选择的活动,在按照结束时间从早到晚的顺序考察并选择的条件下,不可能与后续选择的活动冲突。

猜你喜欢

转载自blog.csdn.net/COFACTOR/article/details/110577930