有期限的作业调度算法.doc_第1页
有期限的作业调度算法.doc_第2页
有期限的作业调度算法.doc_第3页
有期限的作业调度算法.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

有期限的作业调度算法一、典型算法贪心算法是以局部最优为原则,通过一系列选择来得到问题的一个最优解,它所做的每一个选择都是当前状态下某种意义上的最佳选择.贪心算法适合于解决这样的问题:局部的最优解能够导致最终结果的最优解。“有限期作业安排问题”描述如下:有n个任务j1,j2,.,jn,每个任务ji都有一个完成期限di,若任务ji在它的期限di内完成,则可以获利ci(1in);问如何安排使得总的收益最大(假设完成每一个任务所需时间均为一个单位时间).这个问题适合用贪心算法来解决,贪心算法的出发点是每一次都选择利润大的任务来完成以期得到最多的收益;但是对于本问题由于每一个任务都有一个完成的期限,因此在任务安排过程中除了考虑利润ci外,还要考虑期限di.(一)算法描述1假设用数组j存储任务,用数组c存储利润,用数组d存储期限,用数组p存储安排好的任务.按照利润从大到小的次序,调整任务的次序:对n个任务j1,j2,.,jn进行调整,使其满足c1c2cn.2将排序后的任务顺次插入输出数组p.a)任务j1排在p1;b)若已经优先安排了k个任务,则它们满足dpi i(1ik),即利润较高的k个任务能够在它们的期限内完成.那么,对于第k+1个任务jk+1,显然ck+1 ci(1ik);比较dk+1和dpk:a)若dk+1大于dpk,那么将它排在第k+1位(pk+1jk+1);b)若dk+1小于等于dpk,那么,jk能否插入,需比较k和dpk而定:i)若k等于dpk(其第k个任务已经排在可以满足的最迟时间),那么,因为ckck+1,只好放弃任务jk+1;ii)若k小于dpk(表示第k个任务还有推后的余地):若dk+1=k,将第k个任务后移一位(pk+1pk),将第k+1个任务排在第k位(pk jk+1).若dk+1k,则继续比较任务jk+1与第k-1个任务,方法同上.c)重复b)直至处理完最后一个任务.3)输出p.(二)算法实现voidjob-arrangement(char*j,intd,intc,intp,intn)sort(c,j,d,n); /*按照降序调整数组c,同时对数组j!d作相应调整*/p0=0;d0=0;p1=1;k=1;for(i=2;i=di)&dpr!=rr-; if(dprr;h-) ph+1=ph; k+; pr+1=i; output(p,j,n) (三)算法分析该算法在最坏情况下的时间复杂度是o(n),在最好情况下的是o(n)二利用union与find进行作业排序利用不相交集合的union与find算法以及使用一个不同的方法来确定部分解的可行性。如果j是作业的可行子集,那么可以使用下述规则来确定这些作业中的处理时间:若还没给作业i分配处理时间,则分配给它时间片-1,其中应尽量取大且时间片-1,是空的。所以在将作业一个一个地装配到j中时,就不必为接纳新作业而移动j中已分配了时间片的作业。(一)算法描述 给定一批作业x=x,x,x,对每个i,与x相关联的d0和p0,d是x的时间期限,p是xi的收益,di和pi都是整数,1in.1对x=x1,x2,xn中的元素按pi的非增序重新排列得到xi1,xi2,xin,把新的序列仍记为x1,x2,xn,这时有p1p2pn.2令d=maxdi1in,再令b=minn,d.可知有效作业最多是b个.现在设置b个时间单元,每个单位时间区间看作是一个单元,即0,1,1,2,b-1,b看作b个单元,为了讨论方便增加一个辅助单元-1,0.在每一个时间单元中可以完成一个任务.3按贪心算法,把x1,x2,xn依次安排在合适的时间单元中.开始时,每个时间单元都是一个空闲的区间.第一步,我们把x1安排在第di个空闲的区间中.第二步,把第di单元和第di-1单元合并为一个单元.在此,需要定义单元的一个等价类:单元i单元j当且仅当单元i与单元j的左边(包括本身)的第一个空闲区间相同第三步,考察第i个作业xi时,用find找出di所在的等价类,设di所在的等价类左边第一个空闲区间为k,则把xi安排在第k个区间,然后将单元k与单元k-1合并.若k=0(第0个单元指-1,0),则不能安排xi,即舍弃xi,考察下一个任务xi+1.4重复3中的第三步,直到结束(二)算法实现line procedure fls(d,n,b,j,k)/找最优解j=j(1),j(k)/假定p1p2p3,b=minn,maxd(i)/interge b,d(n),j(n),f(0:b),p(0:b)for i0 to n dof(i) i;p(i) -1repeatk0for i1 to 0 dojfind(min(n,d(i)if f(j)0 then kk+1;j(k) ilfind(f(j)-1);call union(l,j)f(j) f(l)endifrepeatend fjs (三)算法分析在1中,对x=x1,x2,xn按pi的非增序重新排序,若用快速排序法,其平均时间复杂度为o(nlogn)在2中,考察每一个xi,1in,需调用一次find,总共调用find的次数n,总共调用union的次数1bn.所以其时间复杂度近似于o(nlogn).综合以上分析,无论采用什么排序算法,整个有限期作业调度算法其时间复杂度不低于o(nlogn)三改进算法(一)改进策略典型算法利用优先策略很好的解决了有限期作业安排问题。但由于采取顺序查找方式定位,平均查找长度较大,并且需要进行移动操作,效率较低.改进算法的基本思想是:对每一个任务ji(1in)来说,其首选插入位置k为其满足期限要求的最迟时间(即k=di).如果pk空闲则将其插入,否则说明已有一利润更大的任务安排在此,应向前搜索(因为只有安排在期限内才能获利);在搜索过程中,找到空闲位就将其插入;若搜索结束仍未找到有空闲位,则将任务ji舍去.设已安排任务集合sp=j1,j2ji-1,当前任务为ji,未安排任务集合sj=ji+1,ji+2jn.若任务ji能够插入到集合sp中,对于jisj,必有cicj,且ji处在其期限的边界位置,所以能够保证ji不再被移动;若插入失败,对于jisp,必有cpci,所以任务ji必被舍弃.通过缩小搜索空间来进一步优化算法.设置左边界指针h用以纪录搜索终止位置,其初值为1.当某个任务ji(1in被放弃时,则说明在输出数组p的前di个节点都已经被安排,则以后没有必要再次搜索,所以下次搜索的终点为di+1(即hdi+1).设置右边界指针t用以标识当前任务ji的最优搜索起始位置,初始值为n.对于任务ji来说,其最大安排期限不可能大于n,所以若存在din,则令其插入预选位置k为t,同时修改t.(二)算法描述1假设用数组j存储任务,用数组c存储利润,用数组d存储期限,用数组p存储安排好的任务。按照利润从大到小的次序,调整任务的次序:对n个任务j1,j2,.,jn进行调整,使其满足c1c2. cn.2将排序后的任务顺次插入输出数组p.a)对t和h设初值:h=1;t=n;b)令任务ji的首选插入位置k为di;c)插入过程:i)若k小于h,则放弃ji(因为前h个位置已有任务插入),则转b)处理下一任务;ii)若k大于t,则令k等于t(因为只有前t个位置才有可能进行插入),并使t减1;iii)若pk为空(即此时还没有任务安排在此),则将ji插入到此位置,则转b)处理下一任务;否则说明已有一个利润更大的任务安排在此,则转c)向前继续搜索.3输出p.(三)算法实现voidjob-arrangemement(char*j,intd,intc,intp,intn)sort(c,j,d,n); /*按照降序调整数组c,同时对数组j,d作相应调整*/for(i=1;i=n;i+)pi=0;h=1;t=n;i=1;k=di;while(i=n)if(k=t)k=t; t-; if(pk=0)pk=i; i+; k=di; else k-;output(p,j,n) (四)算法分析对任一任务ji(1in),其在输出数组p中位置的确定,传统算法采用顺序查找,每次从当前的最后位置依次向前查找,随着被插入任务的增加,查找长度愈来愈大;并且插入任务时需要移动若干已插入的任务,算法效率低.改进算法采用哈希存储的思想,当哈希函数的设置合适时,大多数情况下能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论