解决活动安排问题
小明学校的阶梯教室经常开展各类活动那个,这些活动的开始和结束时间各异,且可能出现重叠,为了开展尽可能多的活动,要怎么安排?
问题描述
小明学校有讲座、演出、电影放映、辩论赛、考试和会议等一系列活动需要在阶梯教室举行,具体活动信息如下,怎么样安排才能使尽可能多的活动的得以开展?
活动信息表:
为了解决问题,我们考虑使用贪心算法解决问题。
问题分析
目标是在固定的教室中尽量多地安排活动,可以考虑的贪心策略有总是选择最早开始的、总是选择时间最短的、总是选择与其他活动冲突最少的、总是选择结束时间最早的。
设 Sij 为包含所有待安排活动的一个集合,其中的活动开始时间均晚于时间节点i,结束时间均早于时间节点。定义最大兼容活动子集Aij为包含Sij中互不冲突的活动数量最多的集合,且用a来表示Sij中的活动,用|A|表示集合A中的元素数量。
首先证明最优子结构性质。
要证明贪心策略满足最优子结构性质,即需证明若Aij,为Sij的最大兼容活动子集,存在Aij中的活动ak,将Aij,分解为Aik, ak和Akj三部分,使Aij;包含Sih和Skj的最优解。
用反证法证明。假设存在Skj的兼容活动子集Akj‘,满足|Akj’|>|Akj|即Akj中包含的活动数量多于Akj则可将Akj’作为Skj的最优解,成为Sij最优解的一部分,则满足|Aik|+|Akj|>|Aik|>|Akj|存在比Aij,更优的最大兼容活动子集,这与条件相矛盾,因此假设不成立。
接着证明贪心选择性质。
根据每次优先选择最早结束活动的贪心策略,只要证明通过该策略获得的局部最优解可以构造出全局最优解,即可说明该贪心策略有效,具备贪心选择性质。
我们证明若am为Sk中结束最早的活动,则am一定在Sk的某个最大兼容活动子集中。
证明了总是优先选择最早结束的活动这一贪心策略同时具备最优子结构性质和贪心选择性质,说明应用该策略进行贪心选择,可以获得活动安排问题的全局最优解。
最终代码
通过比较下一个活动的开始时间与上一个活动的结束时间的大小关系,确定这两个活动是否是相容的,如果开始时间大于结束时间,则相容,反之则不容,代码如下:
def bubble_sort(s,f):
for i in range(len(f)):
for j in range