活动安排贪心算法

活动安排问题

问题表述:设有n个活动的集合E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si = fj或sj >= fi时,活动i与活动j相容。

由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。

算法greedySelector的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。

例:设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:

算法greedySelector 的计算过程如下图所示。图中每行相应于算法的一次迭代。阴影长条表示的活动是已选入集合A的活动,而空白长条表示的活动是当前正在检查相容性的活动。

若被检查的活动i的开始时间Si小于最近选择的活动j的结束时间fi,则不选择活动i,否则选择活动i加入集合A中。

贪心算法并不总能求得问题的整体最优解。但对于活动安排问题,贪心算法greedySelector却总能求得的整体最优解,即它最终所确定的相容活动集合A的规模最大。这个结论可以用数学归纳法证明。

活动安排问题实现:

#include

using namespace std;

#define SIZE 11 //控制活动总数量的大小

typedef int Type;

void GreedySelector(int n,Type s[],Type f[],bool A[])

{

A[0]=true;

int j=0;

for(int i=1;i

{

if(s[i]>=f[j])

{

A[i]=true;

j=i;

}

else A[i]=false;

}

}

void main()

{

int t=0;

Type s[SIZE]={1,3,0,5,3,5,6,8,8,2,12};

Type f[SIZE]={4,5,6,7,8,9,10,11,12,13,14};

bool re[SIZE];

GreedySelector(SIZE,s,f,re);

cout

for(int i=0;i

{

if(re[i])

{

cout

t++;

}

}

cout

cout

}

活动安排问题

问题表述:设有n个活动的集合E = {1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si = fj或sj >= fi时,活动i与活动j相容。

由于输入的活动以其完成时间的非减序排列,所以算法greedySelector每次总是选择具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。

算法greedySelector的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。

例:设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:

算法greedySelector 的计算过程如下图所示。图中每行相应于算法的一次迭代。阴影长条表示的活动是已选入集合A的活动,而空白长条表示的活动是当前正在检查相容性的活动。

若被检查的活动i的开始时间Si小于最近选择的活动j的结束时间fi,则不选择活动i,否则选择活动i加入集合A中。

贪心算法并不总能求得问题的整体最优解。但对于活动安排问题,贪心算法greedySelector却总能求得的整体最优解,即它最终所确定的相容活动集合A的规模最大。这个结论可以用数学归纳法证明。

活动安排问题实现:

#include

using namespace std;

#define SIZE 11 //控制活动总数量的大小

typedef int Type;

void GreedySelector(int n,Type s[],Type f[],bool A[])

{

A[0]=true;

int j=0;

for(int i=1;i

{

if(s[i]>=f[j])

{

A[i]=true;

j=i;

}

else A[i]=false;

}

}

void main()

{

int t=0;

Type s[SIZE]={1,3,0,5,3,5,6,8,8,2,12};

Type f[SIZE]={4,5,6,7,8,9,10,11,12,13,14};

bool re[SIZE];

GreedySelector(SIZE,s,f,re);

cout

for(int i=0;i

{

if(re[i])

{

cout

t++;

}

}

cout

cout

}


相关文章

  • 贪心算法解决活动安排问题研究
  • 贪心算法解决活动安排问题研究 摘要:利用贪心算法解决如何使用最少的资源安排一系列活动.并证明了贪心算法解决此问题的有效性,且进行了实例验证,并进行了复杂度分析,此算法是解决资源组合规划问题较好的方法. 关键词:贪心算法:java程序:复杂度 ...查看


  • 基于贪心算法的0_1背包问题
  • ISSN1009-3044第6卷第35期(2010年12月)与技术ComputerKnowledgeandTechnology电脑知识 Vol.6,No.35,December2010,pp.10061-10062E-mail:xsjl@c ...查看


  • 西安邮电大学算法资料
  • 选择: 1.算法的性质包括输入.输出.( A ).有限性. A. 确定性 B. 随机性 C. 复杂性 D. 渐近复杂性 2.备忘录法是那种算法的变形( B ). A.分治算法 B.动态规划算法 C.贪心算法 D.回溯法 3.具有最优子结构的 ...查看


  • 贪心算法思想
  • 贪心算法思想 顾名思义,贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择.当然,希望贪心算法得到的最终结果也是整体最优的.虽然贪心算法不能对所有问题都得到整体最优解,但对 ...查看


  • 算法设计与分析论文
  • 贪心算法 --不在贪心中爆发,就在贪心中灭亡 武汉理工大学计算机科学与技术学院班 摘要 本文介绍贪心算法的基本意义以及算法的使用范围,并通过具体的案例来分析贪心算法的具体应用,从而指出其特点和存在问题. 关键字:贪心算法,贪心策略,TSP. ...查看


  • 贪心算法的应用
  • 贪心算法的应用 课程名称: 院 系: 学生姓名: 学 号: 专业班级: 指导教师: 201312-27 贪心算法的应用 摘 要:顾名思义,贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义 ...查看


  • 算法设计与分析复习题目及答案
  • 分治法 1.二分搜索算法是利用( 分治策略)实现的算法. 9. 实现循环赛日程表利用的算法是(分治策略 ) 27.Strassen矩阵乘法是利用(分治策略 )实现的算法. 34.实现合并排序利用的算法是(分治策略 ). 实现大整数的乘法是利 ...查看


  • 贪心法求解单元最短路径问题
  • 实验1. 贪心法求解单源最短路径问题 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述.算法设计.算法描述.算法正确性证明.算法分析.算法实现与测试).应用贪心策略求解有向带权图的单源最短路径问题. 实验目的 通过本次实 ...查看


  • 贪心算法计算最优分解方案
  • 西安邮电大学 (计算机学院) 课内实验报告 实验名称: 专业名称: 班级: 学生姓名: 学号(8指导教师: 实验日期:2016年6月1日 一. 实验目的及实验环境 实验目的: 熟悉并掌握贪心算法 实验环境: windows7 vc6.0编译 ...查看


热门内容