课程设计报告-贪心算法:任务调度问题

合集下载

贪心法解活动安排问题(计算机算法设计与分析)

贪心法解活动安排问题(计算机算法设计与分析)

实验报告
课程名称:算法设计与分析实验名称:贪心法解活动安排问题任课教师:专业:计算机科学与技术
班级: 20xx 级x班学号:
姓名:完成日期: 20xx年x月xx日
五、实验总结
在做本实验之前,自己看了课本上所列举的贪心法解活动安排问题的代码,代码很简单,很容易理解,于是就按课本的代码实现。

通过几个测试用例测试发现结果不对,后来发现自己忘了进行贪心法的一个前提条件,事先没有按各个活动结束时间对所有活动进行非递减排序,所以才会导致结果错误。

经过修正后,自己真正理解了贪心法解活动安排问题的原理,重新完成本次实验内容也是很顺利,在编程方面没有遇到什么困难。

算法分析与设计-实验四 作业调度问题-实验报告

算法分析与设计-实验四 作业调度问题-实验报告

南阳理工学院算法分析与设计实验报告册开课学院:计算机与软件学院实验项目:实验4:贪心法(作业调度问题)实验时间:第10周周3(3,4)节实验地点: 15#515指导教师:学生姓名:学生学号:专业班级:2020-2021学年第1学期一、实验目的1.了解贪心算法思想及基本原理2.掌握使用贪心算法求解问题的一般特征3.能够针对实际问题,能够正确选择贪心策略4.能够针对选择的贪心策略,证明算法的正确性5.能够根据贪心策略,正确编码6.能够正确分析算法的时间复杂度和空间复杂度二、实验平台1.JDK1.82.IDEA三、实验内容设有n个独立的作业{1, 2, …,n},由m台相同的机器{M1, M2, …,Mm}进行加工处理,作业i所需的处理时间为ti (1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。

多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

提示:贪心法求解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。

按照最长处理时间作业优先的贪心策略,当m≥n时,只要将机器i的[0, ti)时间区间分配给作业i即可;当m<n时,首先将n 个作业依其所需的处理时间从大到小排序,然后依此顺序将作业分配给空闲的处理机。

四、算法设计1.问题分析设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小的子作业。

要求给出一种作业调度方案,使所给的n 个作业在尽可能短的时间内由m台机器加工处理完成。

多机调度问题是一个NP完全问题,到目前为止还没有完全有效的解法。

对于这类问题,用贪心选择策略有时可以设计出一个比较好的近似算法。

贪心算法实验报告算法实验贪心法实验报告

贪心算法实验报告算法实验贪心法实验报告

贪心算法实验报告算法实验贪心法实验报告西安邮电大学(计算机学院)课内实验报告实验名称:贪心算法专业名称:班级:学生姓名:学号(8指导教师:实验日期:一. 实验目的及实验环境1.练习掌握最有分解问题的规划设计与实现;2.熟练掌握递归算法的设计及应用,怎样才能使算法的空间复杂度和时间复杂度最低;基于Linux系统下的ubuntu或其他的编辑器二. 实验内容1. 设n是一个正整数,现在要求将n分解为若干互不相同的自然数的和,且使这些自然数的乘积最大三.方案设计1.先将这个数分解成以2开始的连续的若干因子,它们的和加起来是n,将此数在后项优先的方式下均匀地分给前面各项。

保证正整数所分解出的因子之差的绝对值最小,即| a – b |最小,可以保证分解乘积越大。

四.测试数据及运行结果1.正常测试数据(3组)及运行结果;A.2.非正常测试数据(2组)及运行结果A.B.五.总结1.实验过程中遇到的问题及解决办法;在实验过程中错误不断地出现,我认真地查阅书籍,研究课本上例题,并且在同学的帮助下纠正了自己的错误,得出了正确的结果。

2.对设计及调试过程的心得体会。

在程序的运行与调试过程中出现了很多错误,但是通过自己复习课本知识、查询资料等,修改后得出了正确的结果。

而且我觉得自己一定要敢于尝试,即使没有结果但是勇于实践就会有意想不到的收获。

所以在以后的学习中我觉得我们一定要集中精力、端正自己态度,提高自己的成绩。

当然我也认识到了自己的薄弱之处,因此我一定争取做的能让自己满意,做的更好。

六.附录:源代码(电子版)#include#includevoid open_file(int n){FILE *fp;if((fp=fopen(“input.txt”,”wt”))==NULL) {printf(“the file write failed.\n”);exit(1);}fprintf(fp,”%2d\n”,n);fclose(fp);}void save_file(int sum){FILE *fp;if((f p=fopen(“output.txt”,”wt”))==NULL) {printf(“ the file save failed!.\n”);exit(1);}fprintf(fp,”%2d\n”,sum);fclose(fp);if((fp=fopen(“output.txt”,”r”))==NULL) {printf(“save file failed!\n”);exit(1);}fscanf(fp,”%2d”,&sum);printf(“\n鏈€澶х?d\n”,sum);fclose(fp);}int MAX(int n){int i=2,j=0,data[n],sum=0,max=1; int lenth; while(sum+i{sum+=i;data[j]=i;i++;j++;}lenth=j;i=n-sum;while(i>0){if(j{data[j+i]+=1;i--;j--;}else{data[j-1]+=1;i--;j--;}}for(i=0;imax*=data[i];return max;}int main(){int n,max;srand((unsigned)time(NULL)); n=rand()%100; open_file(n);printf(“ 杩欎釜鏁版槸%d:\n”,n); max=MAX(n); save_file(max);return 0; }百度搜索“就爱阅读”,专业资料,生活学习,尽在就爱阅读网,您的在线图书馆。

贪心算法在任务调度中的应用

贪心算法在任务调度中的应用

贪心算法在任务调度中的应用在任务调度中,选择最优的方案是一个核心问题。

贪心算法是一种运用广泛的解决最优问题的算法,其优势在于可以处理高效率、可扩展性、可贪心性等众多特性。

然而,在实际应用中,贪心算法也需要根据不同场景进行不同的调整。

本文将探讨贪心算法在任务调度中的应用,包括背包问题、最小生成树问题和区间调度问题等。

一、背包问题背包问题是一个经典的优化问题,其核心是如何选择一组物品,使得总重量不超过背包能够容纳的最大值,同时价值最大化。

在任务调度中,背包问题可以被用来解决资源分配问题,例如在云计算中,如何合理地分配虚拟机来保证服务质量和节约资源。

贪心策略是按照每个物品的单位价值来进行排序,优先选择单位价值高的物品先放入背包中。

这样可以使得背包中的物品价值最大化,同时满足容量限制。

具体实现中,可以在排序后从价值最高的物品开始放入背包,直到背包无法容纳为止。

但是在实际应用中,贪心算法并不一定能够获得最优解。

在一些场景中,例如物品具有相同的价值,需要根据其他因素进行调整。

此外,在背包容量限制较小的情况下,贪心策略也可能会导致不优的解。

二、最小生成树问题最小生成树问题是一个经典的图论问题,其核心是从一个无向图中寻找一棵生成树,使得树上所有边的权值之和最小。

在任务调度中,最小生成树问题可以被用来解决任务分配问题,例如如何合理地分配人力资源来保证任务的顺利完成。

贪心策略是按照边的权值进行排序,优先选择权值最小的边来进行连接。

在每个节点中维护一个集合,表示当前节点所在的连通块。

在选择一条边之后,可以将两个连通块进行合并,直到所有节点被连接为止。

但是在实际应用中,最小生成树问题也需要根据具体情况进行调整。

例如在一些特殊场景中,例如图中存在负权边时,需要使用其他算法来处理;在连通块的个数较多时,贪心策略也可能会导致无法得到最优解。

三、区间调度问题区间调度问题是一个经典的贪心问题,其核心是找到最大的相容区间数量。

在任务调度中,区间调度问题可以被用来解决场馆安排、空间分配等问题。

贪心算法设计实验报告

贪心算法设计实验报告

A
B
C
D
E
F
G
0
0
0
0
1
0
0
0
对表进行维护(维护后仍同上表,因为还没有两个集合合并)
0
A
B
C
D
E
F
G
0
0
0
0
1
0
0
0
C,选择第二条边 C----E (修改上表)
0
A
B
C
D
E
F
G
0
0
0
0
1
3
0
0
对上表进行维护(任同上表,因为还没有两个集合合并)
0
A
B
C
D
E
F
G
0
0
0
0
1
3
0
0
D,选择第三条边( D-----F ) (根据条件 DF 两点不再同一集合,改边可选 ) 然后就合并 DF 两点所在的集合 D 的前去是 1,即 A 标记为 0, E 的标记也为 0,合并因为 6>1 所以表修改如下
Edge* selectionsort(Edge *array,int n)// 选择排序(对边按权重由高到低排序) {
int i,j,min,temp; for(i=0;i<n;i++) {
min=i; for(j=i+1;j<n;j++)
if(array[min].weight>array[j].weight) min=j;
在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中
只有一棵树,也即子图中含有

贪心算法解决活动安排问题报告

贪心算法解决活动安排问题报告

1.引言:贪心法是一种改进了的分级处理方法。

用贪心法设计算法的特点是一步一步地进行,每一步上都要保证能获得局部最优解。

每一步只考虑一个数据,它的选取满足局部优化条件。

若下一个数据与部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加为止。

这种能够得到某种度量意义下的最优解的分级处理方法称为贪心法。

贪心算法总是做出在当前看来是最优的选择,也就是说贪心算法并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该题运用贪心算法可以得到最优解或较优解。

2.贪心算法的基本思想及存在问题贪心法的基本思想:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。

当达到某算法中的某一步不能再继续前进时,算法停止。

1.建立数学模型来描述问题。

2.把求解的问题分成若干个子问题。

3.对每一子问题求解,得到子问题的局部最优解。

4.把子问题的解局部最优解合成原来解问题的一个解。

3.活动安排问题:3.1 贪心算法解决活动安排问题学校举办活动的安排问题是用贪心算法有效求解的一个很好例子。

活动安排问题要求安排一系列争用某一公共资源的活动。

用贪心算法可使尽可能多的活动能兼容的使用公共资源。

设有n个活动的集合{0,1,2,…,n-1},其中每个活动都要求使用同一资源,如会场等,而在同一时间内只有一个活动能使用这一资源。

每个活动i都有一个要求使用该资源的起始时间starti和一个结束时间endi,且starti<endi。

如选择了活动i,则它在半开时间区间[starti,endi)内占用资源。

若区间[starti,endi)与区间[startj,endj)不相交,称活动i与活动j是相容的。

也就是说,当start j≥endi或starti≥endj时,活动i与活动j相容。

活动安排问题就是在所给的活动集合中选出最大的相容子活动集合。

贪心算法实验报告

贪心算法实验报告
#define N 20
typedef struct node{
int id ,time;//作业所需时间
}jobnode;
typedef struct Node{
int id ,avail;//id机器编号、avail每次作业的初始时间
}manode;
manode machine[N];
jobnode job[N];
scanf("%d",&n);
printf("请输入加油站的个数:");
scanf("%d",&k);
for(i=0;i<=k;i++)
scanf("%d",&d[i]);
greedy(d,n,k);
}
实验结果截图:
(3)实验代码:设有n个正整数,将它们连接成一排,组成一个最大的多位整数
#include<stdio.h>
return;
}
}
for(i=0,s=0;i<=k;i++){
if(s<n)
s+=d[i];
else if(s>n){
n=s-d[i];
num++;
}
}
printf("%d\n",num);
}
void main(){
int i,n,k;
int d[1000];
printf("请输入汽车可行驶公里数:");
/*找出下一个作业执行机器*/
manode *Find_min(manode a[],int m){
manode *temp=&a[0];

贪心算法实验报告

贪心算法实验报告

一、实验目的通过本次实验,使学生对贪心算法的概念、基本要素、设计步骤和策略有更深入的理解,掌握贪心算法的原理和应用,并能够运用贪心算法解决实际问题。

二、实验内容本次实验主要涉及以下两个问题:1. 使用贪心算法解决单起点最短路径问题;2. 使用贪心算法解决小船过河问题。

三、实验原理1. 贪心算法贪心算法(又称贪婪算法)是一种在每一步选择中都采取当前最优的选择,从而希望导致结果是全局最优的算法。

贪心算法在每一步只考虑当前的最优解,不保证最终结果是最优的,但很多情况下可以得到最优解。

2. 单起点最短路径问题单起点最短路径问题是指在一个有向无环图中,从某个顶点出发,找到到达其他所有顶点的最短路径。

3. 小船过河问题小船过河问题是指一群人需要划船过河,船只能容纳两个人,过河后需要一人将船开回,问最少需要多久让所有人过河。

四、实验步骤及说明1. 创建图结构,包括顶点数组和边信息。

2. 使用Dijkstra算法求解单起点最短路径问题,得到最短路径和前驱顶点。

3. 使用贪心算法找到两点之间的最短距离,并更新距离和前驱顶点信息。

4. 遍历所有顶点,找到未纳入已找到点集合的距离最小的顶点,并更新其距离和前驱顶点。

5. 最终输出从源顶点到达其余所有点的最短路径。

6. 使用贪心算法解决小船过河问题,按照以下步骤进行:(1)计算所有人过河所需的总时间;(2)计算每次划船往返所需时间;(3)计算剩余人数;(4)重复(2)和(3)步骤,直到所有人过河。

五、实验结果与分析1. 单起点最短路径问题实验中,我们选取了有向无环图G,其中包含6个顶点和8条边。

使用贪心算法和Dijkstra算法求解单起点最短路径问题,得到的实验结果如下:- 贪心算法求解单起点最短路径问题的时间复杂度为O(V^2),其中V为顶点数;- Dijkstra算法求解单起点最短路径问题的时间复杂度为O(V^2),其中V为顶点数。

2. 小船过河问题实验中,我们选取了一群人数为10的人过河,船每次只能容纳2人。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计报告贪心算法:任务调度问题的设计专业学生姓名班级学号指导教师完成日期贪心算法:任务调度问题的设计目录1设计内容 (1)2)输入要求 (1)3)输出要求 (1)2设计分析 (1)2.1排序(将数组按照从小到大排序)的设计 (1)2.2多个测试案例的处理方法的设计 (2)2.3 for循环设计 (2)2.4系统流程图 (2)3设计实践 (2)3.1希尔排序模块设计 (2)3.2 多个测试案例的处理方法的模块设计 (3)4测试方法 (4)5程序运行效果 (4)6设计心得 (6)7附录 (6)数据结构课程设计报告(2017)贪心算法:任务调度问题的设计1设计内容有n项任务,要求按顺序执行,并设定第I项任务需要t[i]单位时间。

如果任务完成的顺序为1,2,…,n,那么第I项任务完成的时间为c[i]=t[1]+…+t[i],平均完成时间(ACT)即为(c[1]+..+c[n])/n。

本题要求找到最小的任务平均完成时间。

2)输入要求输入数据中包含n个测试案例。

每一个案例的第一行给出一个不大于2000000的整数n,接着下面一行开始列出n各非负整数t(t≤1000000000),每个数之间用空格相互隔开,以一个负数来结束输入。

3)输出要求对每一个测试案例,打印它的最小平均完成时间,并精确到0.01。

每个案例对应的输出结果都占一行。

若输入某一个案例中任务数目n=0,则对应输出一个空行。

2 设计分析这个题目属于贪心算法应用中的任务调度问题。

要得到所有任务的平均完成时间,只需要将各个任务完成时间从小到大排序,任务实际完成需要的时间等于它等待的时间与自身执行需要的时间之和。

这样给出的调度是按照最短作业优先进行来安排的。

贪心算法通过一系列的选择来得到一个问题的解。

它所做的每一个选择都是当前状态下某种意义的最好选择,即贪心选择。

在许多可以用贪心算法求解的问题中一般具有两个重要的性质:贪心选择性质和最有子结构性质。

所谓贪心选择性只是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到,这是贪心算法可行的第一基本要素。

对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所做的贪心选择最终将会得到问题的一个整体最优解。

首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。

而且做了贪心选择后,原问题简化为一个规模更小的类似子问题。

然后,用数学归纳法证明,通过每一步做贪心选择,最终可得到问题的一个整体最优解。

其中,证明贪心选择后问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。

当一个问题的最优解包含着它的子问题最优解时,称此问题具有最优子结构性质,这个性质是该问题可用贪心算法求解的一个关键特征。

2.1排序(将数组按照从小到大排序)的设计排序的方法有很多,如:冒泡排序、希尔排序、堆排序等,这些排序的方法都可以使用。

这里采用希尔排序来实现。

它的基本思想是:先取一个小于n的整数d1作为第一个增量;这里选取n的一半作为第一个增量(increment=n》1),把数组的全部元素分成d1个组。

所有距1贪心算法:任务调度问题的设计离为d1的倍数的记录放在同一组中。

先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量d1=1(dt<dt-1<···<d2<d1),即所有记录放在同一组中进行直接插入排序位置。

该方法实质上是一种分组插入排序方法。

2.2多个测试案例的处理方法的设计程序实现的时候,要求用户一次可以输入椅子或者多组测试案例的数据,当要迷糊糊的输入完成后,程序经过计算在屏幕上分行显示这几个案例的结果。

因此有多个测试案例的情况下,需要设置一个数组,用来存放么每一组测试案例的计算结果。

2.3 for循环设计明确了可以用最短作业优先的思想后,就可以正式来设计题目的实现了。

首先,输入的测试案例可以有很多组,每一个案例的输入格式都是第一行输入任务的个数,然后下面一行输入每一个任务需要的时间单位,输入完成另起一行,可以再继续输入下一个案例的数据。

最后用一个任意的负数来表示输入的结束。

这样,由于案例的个数开始不得知,所以可以套用一个for循环。

2.4系统流程图3设计实践3.1希尔排序模块设计void Shellsort(long *a,long n){long i,j,increment;long temp;for(increment=n>>1;increment>0;increment>>=1){for(i=increment;i<n;i++)2数据结构课程设计报告(2017){temp=*(a+i);for(j=i;j>=increment;j-=increment){if(temp<*(a+(j-increment)))*(a+j)=*(a+(j-increment));elsebreak;}*(a+j)=temp;}}}3.2 多个测试案例的处理方法的模块设计double r[100];/*用来存放每个测试案例的计算结果*/j=0;/*记录测试案例的个数*//*读入用户的输入,若当前输入为负数,则程序终止*/for(n=0;n>=0;){scanf("%ld",&n);if(n>2000000){printf("too much for the project!\n");exit(0);}if(n>0){b=(long * )malloc(n * sizeof(long));a=b;for(i=0;i<n;i++){scanf("%ld",b+i);/*检查输入的数据是否大于1000000000*/if(*(b+i)>1000000000){printf("too much for the project!\n");exit(0);}/*对输入中出现任务时间为负数的异常处理*/if(*(b+i)<0){printf("input error!\n");return 0;}}Shellsort(b,n);/*计算平均完成时间*/for(i=n,r[j]=0.0;i>0;i--,a++){3贪心算法:任务调度问题的设计r[j]+=(double)*a/(double)n*i;}j++;free(b);}/*当n为0时,标志相应的r数组值为-1.输出时遇到-1,则输出一个空行*/ else if(n==0){r[j++]=-1;}}for(i=0;i<j;i++){if(r[i]==-1)printf("\n");/*输出一个空行8*/else printf("%.2f\n",r[i]);/*输出的结果要求精确到0.01*/ }return 1;}4测试方法这个程序主要需要测试以下几个方面:●当任务个数为0时,需要对应输出一个空行。

●当输入的作业数目大于2000000,或者单个作业完成的时间大于1000000000的时候,程序要求报错。

●另外,当任务数比较大的时候,输入对应的任务时间是要仔细,务必保证输入的任务个数与要求的任务数一直。

如果出现输入的任务数与n值不相符时,程序应会报错,输出“input error!”的错误。

5 程序运行效果5.1正确输入正确输出。

4数据结构课程设计报告(2017)图5.1 正确输入输出数据图5.2异常输入数据5.2.1输入数据超出2000000。

图5.2.1 超出作业数目异常图5.2.2任务数较大时输出任务个数与要求任务数不一致。

图5.2.2 任务数不一致异常图5.2.3单个作业完成时间大于1000000000。

图5.2.3 单个作业完成时间超出异常图5贪心算法:任务调度问题的设计6 设计心得通过本次课程设计我在数据结构编程方面领悟了很多。

看到这个选题的时候,其实我并不知道贪心算法是什么算法,甚至都无从下手去设计关于这个的编程以及它的报告。

虽然在中间写的过程中还有很多不会的东西,但是通过查看书本和资料还有问同学,基本上都解决了。

但仍然有一些有待提高的地方,比如在排序前后的结果比较和如果运行时间长的任务在等待很长时间都没有运行等较高的要求还没有解决。

设计根据书本以及老师和同组同学的帮助,本次设计也算是完成了。

我在这次设计中其实自己也没花好时间去完成。

关于程序方面也有许多的不明白。

但是通过本次设计,我也领悟到自身有许多的不足。

以后会更加花心思,下功夫去完成好每一个老师给予的任务,从而提高自己。

我觉得课程设计的作用一方面是最基本的就是要完成这一科目,差不多也是对自己的一个阶段性的总结;还有就是在整个设计的过程中,让我们认真的独立思考,在和同学交流的过程中也增强了我们的语言组织能力和彼此之间的友谊。

通过课程设计让我们不断的发现自己的不足从而去改善,这是一种学习的态度,不仅仅是在这次的课程设计中,在以后的无论生活还是学习方面都应该注意和努力改善。

7附录#include<stdio.h>#include<stdlib.h>void Shellsort(long *a,long n);int main(){long n,i,j;long *a,*b;double r[100];j=0;for(n=0;n>=0;){scanf("%ld",&n);if(n>2000000){printf("too much for the project!\n");exit(0);}if(n>0){b=(long* )malloc(n * sizeof(long));a=b;for(i=0;i<n;i++){scanf("%ld",b+i);if(*(b+i)>1000000000){6数据结构课程设计报告(2017)printf("too much for the project!\n");exit(0);}if(*(b+i)<0){printf("input error!\n");return 0;}}Shellsort(b,n);for(i=n,r[j]=0.0;i>0;i--,a++){r[j]+=(double)*a/(double)n*i;}j++;free(b);}else if(n==0){r[j++]=-1;}}for(i=0;i<j;i++){if(r[i]==-1)printf("\n");else printf("%.2f\n",r[i]);}return 1;}void Shellsort(long *a,long n){long i,j,increment;long temp;for(increment=n>>1;increment>0;increment>>=1){for(i=increment;i<n;i++){temp=*(a+i);for(j=i;j>=increment;j-=increment){if(temp<*(a+(j-increment)))*(a+j)=*(a+(j-increment));elsebreak;}*(a+j)=temp;}}}7。

相关文档
最新文档