课程设计报告贪心算法任务调度问题Word格式文档下载.doc
《课程设计报告贪心算法任务调度问题Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《课程设计报告贪心算法任务调度问题Word格式文档下载.doc(9页珍藏版)》请在冰豆网上搜索。
3.1希尔排序模块设计 2
3.2多个测试案例的处理方法的模块设计 3
4测试方法 4
5程序运行效果 4
6设计心得 6
7附录 6
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个组。
所有距离为d1的倍数的记录放在同一组中。
先在各组内进行直接插入排序;
然后,取第二个增量d2<
d1重复上述的分组和排序,直至所取的增量d1=1(dt<
dt-1<
·
<
d2<
d1),即所有记录放在同一组中进行直接插入排序位置。
该方法实质上是一种分组插入排序方法。
2.2多个测试案例的处理方法的设计
程序实现的时候,要求用户一次可以输入椅子或者多组测试案例的数据,当要迷糊糊的输入完成后,程序经过计算在屏幕上分行显示这几个案例的结果。
因此有多个测试案例的情况下,需要设置一个数组,用来存放么每一组测试案例的计算结果。
2.3for循环设计
明确了可以用最短作业优先的思想后,就可以正式来设计题目的实现了。
首先,输入的测试案例可以有很多组,每一个案例的输入格式都是第一行输入任务的个数,然后下面一行输入每一个任务需要的时间单位,输入完成另起一行,可以再继续输入下一个案例的数据。
最后用一个任意的负数来表示输入的结束。
这样,由于案例的个数开始不得知,所以可以套用一个for循环。
2.4系统流程图
Main函数
Menu==1
Menu==0
Case1输出排序之前结果排序sort()输出排序之后结果
程序结束
3设计实践
3.1希尔排序模块设计
voidShellsort(long*a,longn)
{
longi,j,increment;
longtemp;
for(increment=n>
>
1;
increment>
0;
=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));
else
break;
}
*(a+j)=temp;
}
}
}
3.2多个测试案例的处理方法的模块设计
doubler[100];
/*用来存放每个测试案例的计算结果*/
j=0;
/*记录测试案例的个数*/
/*读入用户的输入,若当前输入为负数,则程序终止*/
for(n=0;
n>
=0;
)
scanf("
%ld"
&
n);
if(n>
2000000){
printf("
toomuchfortheproject!
\n"
);
exit(0);
0)
b=(long*)malloc(n*sizeof(long));
a=b;
for(i=0;
scanf("
b+i);
/*检查输入的数据是否大于1000000000*/
if(*(b+i)>
1000000000)
{
printf("
exit(0);
}
/*对输入中出现任务时间为负数的异常处理*/
if(*(b+i)<
inputerror!
return0;
Shellsort(b,n);
/*计算平均完成时间*/
for(i=n,r[j]=0.0;
i>
i--,a++)
r[j]+=(double)*a/(double)n*i;
j++;
free(b);
/*当n为0时,标志相应的r数组值为-1.输出时遇到-1,则输出一个空行*/
elseif(n==0)
r[j++]=-1;
for(i=0;
j;
if(r[i]==-1)printf("
/*输出一个空行8*/
elseprintf("
%.2f\n"
r[i]);
/*输出的结果要求精确到0.01*/
return1;
4测试方法
这个程序主要需要测试以下几个方面:
l当任务个数为0时,需要对应输出一个空行。
l当输入的作业数目大于2000000,或者单个作业完成的时间大于1000000000的时候,程序要求报错。
l另外,当任务数比较大的时候,输入对应的任务时间是要仔细,务必保证输入的任务个数与要求的任务数一直。
如果出现输入的任务数与n值不相符时,程序应会报错,输出“inputerror!
”的错误。
5程序运行效果
5.1正确输入正确输出。
图5.1正确输入输出数据图
5.2异常输入数据
5.2.1输入数据超出2000000。
图5.2.1超出作业数目异常图
5.2.2任务数较大时输出任务个数与要求任务数不一致。
图5.2.2任务数不一致异常图
5.2.3单个作业完成时间大于1000000000。
图5.2.3单个作业完成时间超出异常图
6设计心得
通过本次课程设计我在数据结构编程方面领悟了很多。
看到这个选题的时候,其实我并不知道贪心算法是什么算法,甚至都无从下手去设计关于这个的编程以及它的报告。
虽然在中间写的过程中还有很多不会的东西,但是通过查看书本和资料还有问同学,基本上都解决了。
但仍然有一些有待提高的地方,比如在排序前后的结果比较和如果运行时间长的任务在等待很长时间都没有运行等较高的要求还没有解决。
设计根据书本以及老师和同组同学的帮助,本次设计也算是完成了。
我在这次设计中其实自己也没花好时间去完成。
关于程序方面也有许多的不明白。
但是通过本次设计,我也领悟到自身有许多的不足。
以后会更加花心思,下功夫去完成好每一个老师给予的任务,从而提高自己。
我觉得课程设计的作用一方面是最基本的就是要完成这一科目,差不多也是对自己的一个阶段性的总结;
还有就是在整个设计的过程中,让我们认真的独立思考,在和同学交流的过程中也增强了我们的语言组织能力和彼此之间的友谊。
通过课程设计让我们不断的发现自己的不足从而去改善,这是一种学习的态度,不仅仅是在这次的课程设计中,在以后的无论生活还是学习方面都应该注意和努力改善。
7附录
#include<
stdio.h>
stdlib.h>
voidShellsort(long*a,longn);
intmain()
longn,i,j;
long*a,*b;
b=(long*)malloc(n*sizeof(long));