机器调度问题实验报告..doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
机器调度问题实验报告.

机器调度问题 1341901201 黄鑫 一、实验描述 机器调度是指有m台机器需要处理n个作业,设作业i的处理时间为t,则对n个作业进行机器分配,使得: (1)一台机器在同一时间内只能处理一个作业; (2)一个作业不能同时在两台机器上处理; (3)作业i一旦运行,则需要ti个连续时间单位。 设计算法进行合理调度,使得在m台机器上处理n和作业所需要的处理时间最短。 二、实验任务 设计调度算法,为每个作业分配一台可用机器 三、概要设计 为给出的作业根据时间数分配机器。将作业按其所需时间的递减顺序排列。一台机器在同一时刻只能处理一个作业,在分配一个作业时,将其分配给最先变为空闲的机器。直到所有作业分配完毕。算出最短调度时间。 输入输出的要求: 每个作业的所需的时间数和机器数为输入。输出为每个作业所分配的机器(每个机器所完成的作业),以及最短调度时间。 四、运行与测试 #includestdio.h #define N 10 //限定机器数和作业数不超过N个 struct MachineNode { int ID; //机器号 int avail; //机器可用时间 }; struct JobNode { int ID; //作业号 int time; //处理时间 }; void Big(JobNode r[],int k,int m)//建立大根堆 { int i,j; i=k; j=2*i; while(j=m) { if(jmr[j].timer[j+1].time) j++; if(r[i].timer[j].time)break; else { int temp1,temp2; temp1=r[i].time; r[i].time=r[j].time; r[j].time=temp1; temp2=r[i].ID; r[i].ID=r[j].ID; r[j].ID=temp2; } } } void SortBig(JobNode r[],int n) { for(int i=n/2;i=1;i--) Big(r,i,n); } void Small(MachineNode r[],int k,int m)//建立小根堆 { int i,j; i=k; j=2*i; while(j=m){ if(jmr[j].availr[j+1].avail)j++; if(r[i].availr[j].avail)break; else { int temp1,temp2; temp1=r[i].avail; r[i].avail=r[j].avail; r[j].avail=temp1; temp2=r[i].ID; r[i].ID=r[j].ID; r[j].ID=temp2; } } } void SortSmall(MachineNode r[],int n) { for(int i=n/2;i=1;i--) Small(r,i,n); } void assign(MachineNode M[],JobNode J[],int m,int j) //完成任务分配 { if(m=j) //如果机器数m大于或等于作业数j { SortBig(J,j); //以各作业所需时间建立大根堆,堆顶元素即为最大耗时的作业所需时间 printf(一台机器完成一个作业,最大工作时间为:%d\n,J[1].time); } else //如果机器数m小于作业数j { for(int i=1;i=m;i++) //先为每台机器分配一个作业,先把所需时间最大的m个作业分配给m台机器 { SortBig(J,j); //建立大根堆求堆顶元素确定其中耗时最大的作业 M[i].avail=J[1].time; //机器i的处理时间即为作业所需时间 printf(机器 %d 完成作业%d\n,M[i].ID,J[1].ID); for(int k=1;kj;k++) //减去已分配的作业 J[k]=J[k+1]; j=j-1; } for(int q=j;j=1;q--) //把剩余的j-m个作业分配下去(j=j-m) { SortSmall(M,m); //将m个机器按可用时建立小根堆 SortBig(J,j); //将j个作业按处理时间建立大根堆 printf(机器 %d 完成作业%d\n,M[1].ID,J[1].ID); //将大根堆

文档评论(0)

sdgr + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档