作业调度快速贪心算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作业调度快速贪心算法
班级:08级通信三班学号:14081403173 姓名:阮晨
成绩:分
一、设计目的
1.掌握贪心算法的思想;
2.掌握贪心算法的典型问题,如作业调度问题;
3.进一步多级调度的基本思想和算法设计方法;
4.提高分析与解决问题的能力。
二、设计内容
1.任务描述
1)多段图问题简介
在无资源约束且每个作业可在等量的是时间内完成的作业调度问题中,可以拟定一个最优解的算法,制定如何选择下一个作业的量度标准,使得所选择的下一个作业在这种量度下达到最优。快速贪心算法利用减少作业移动—分配最晚时间片原则使得作业在最短的时间片内达到最大的效益值。
2)设计任务简介
设计快速贪心算法实现在效益p=(35, 30, 25, 20, 15, 10, 5, 1),时间期限 d=(4, 2, 4, 5, 6, 4, 5, 7)条件下的最大效益,输出作业的调度序列。
2.快速贪心算法的实现过程
已知n=8, p=(35, 30, 25, 20, 15, 10, 5, 1), d=(4, 2, 4, 5, 6, 4, 5, 7)。设计、编程实现作业调度快速贪心算法, 要求按作业调度顺序输出作业序列。
案例分析:
可用最晚空闲时间片序号数组 F[]。
存储截止期限值为 i 的作业可用的最晚空闲时间片序号。
初始状态:
F[0:k]={0, 1, 2, 3, …, k-1, k},k = min { n, max {dj} }
竞争可用最晚空闲时间片的截止期限值集合 set[0:k]
在树结构表示下, 初值为:
set[0:k]={{0,-1},{1, -1},{2, -1},{3, -1}, …,{k-1, -1},{k, -1}}.
如下表:
3.主要数据类型与变量
struct
{int data; int tag;
}set[8]; /*定义结构体,其tag为树结构的根节点,data为树的元素
值*/
int J[8]={0}; /*将输出序列初始化为8个元素的数组*/
int min(int a,int b); /*找出a,b两数中较小者*/
int max(int array[8]); /*找出数组array中的最大值*/ void uin(int x,int y); /*合并输出序列*/
4.算法或程序模块
FastGreedyJobScheduling(int *d, float *p, int *J, int n)
{ int k=min {n, max {d[i]}}, F[k+1];
ElemType set[k+1];
for (i=0; i<=k; i++) {F[i]=i; set [i]. data=i; set [i]. tag=-1;}
for (j=0; i=1; i<=n; i++)
{ r = find ( min (n, d[i-1]) );
if (F[r]!=0){ J[j++]=i; m=find(F[r]-1); union (m, r); F[r]=F[m]; }
}
}
模块函数:int min(int a,int b);
int max(int array[8]);
int find(int f);
void uin(int x,int y);
三、测试结果
。
四、总结与讨论
这次的设计的主要内容是作业调度快速贪心算法,内容对我来说很困难,不易做出。在此看到了编程的功底很差,基本功不扎实。在这次设计中,也遇到了很多问题,主要是对算法中的变量不能明确其意义,从而导致了在调试过程中出现了很多低级错误。只有对算法理解透彻才能够快速、正确的实现算法的要求,达到满意的效果。
附:程序模块的源代码
#include
int F[8];
struct
{ int data;
int tag;
}set[8];
void main()
{ int k,i,j,r,n=8,m;
int J[8]={0};
int find(int t);
int min(int a,int b);
void uin(int,int);
int p[8]={35,30,25,20,15,10,5,1},d[8]={4,2,4,5,6,4,5,7};
for(i=0;i<9;i++)
{ F[i]=i;
set[i].data=i;
set[i].tag=-1;
}
for(j=0,i=1;i<=n;i++)
{ k=min(n,d[i-1]);
r=find(k);
if(F[r]!=0){J[j++]=i;m=find(F[r]-1);uin(m,r);F[r]=F[m];} }
for(i=0;i printf("%d,",J[i]); getch(); } int find(int t) { int q; q=t; if(F[q]==q) return(q); else { find(q-1); } } int min(int a,int b) { int t; t=a return t; } void uin(int a,int b) { int i; for(i=a;i<=b;i++) { set[i].tag=b-i-1; } }