有期限的作业调度算法doc

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

有期限的作业调度算法
一、典型算法贪心算法是以局部最优为原则,通过一系列选择来得到问题的一个最优解,它所做的每一个选择都是当前状态下某种意义上的最佳选择.贪心算法适合于解决这样的问题:局部的最优解能够导致最终结果的最优解。

“有限期作业安排问题”描述如下:有n个任务每个任务Ji都有一个完成期限di,若任务Ji在它的期限di内完成,则可以获利Ci(l[i[n);问如何安排使得总的收益最大(假设完成每一个任务所需时间均为一个单位时间).这个问题适合用贪心算法来解决,贪心算法的出发点是每一次都选择利润大的任务来完成以期得到最多的收益;但是对于本问题由于每一个任务都有一个完成的期限因此在任务安排过程中除了考虑利润Ci外,还要考虑期限di.
(一)算法描述
1.假设用数组J存储任务,用数组C存储利润,用数组d存储期限,用数组P存储安排好的任务.按照利润从大到小的次序,调整任务的次序:
对n个任务J1,J2,...,Jn进行调整,使其满足C1三C2三…三Cn.
2.将排序后的任务顺次插入输出数组P.
A)任务J[1]排在P[1];
B)若已经优先安排了k个任务,则它们满足d[P[i]]三i(1WiWk),即利润较高的k个任务能够在它们的期限内完成•那么,对于第k+1个任务J[k+1],显然C[k+1]WC[i](1WiWk);比较d[k+1]和d[P[k]]:
a)若d[k+1]大于d[P[k]],那么将它排在第k+1位(P[k+1]T[k+1]);
b)若d[k+1]小于等于d[P[k]],那么,J[k]能否插入,需比较k和d[P[k]]而定:
i)若k等于d[P[k]](其第k个任务已经排在可以满足的最迟时间),那么,因为
Ck^Ck+1,只好放弃任务J[k+1];
ii)若k小于d[P[k]](表示第k个任务还有推后的余地):
若d[k+1]=k,将第k个任务后移一位(P[k+1]-P[k]),将第k+1个任务排在第k位(P[k]一J[k+1]).
若d[k+1]<k,则继续比较任务J[k+1]与第k-1个任务,方法同上.
C)重复B)直至处理完最后一个任务.
3)输出P.
(二)算法实现
voidjob-arrangement(char*J[],intd[],intC[],intP[],intn)
{sort(C,J,d,n);/*按照降序调整数组C,同时对数组J!d作相应调整*/
P[0]=0;d[0]=0;P[1]=1;
k=1;
for(i=2;i<=n;i++)
{r=k;
while{(d[P[r]]>=d[i])&&d[P[r]]!=r}r--;
if(d[P[r]]<d[i])
for(h=k;h>r;h--)P[h+1]=P[h];
k++;
P[r+1]=i;
}
output(P,J,n)
}
(三)算法分析
该算法在最坏情况下的时间复杂度是0(n?),在最好情况下的是0(n)
二.利用UNION与FIND进行作业排序
利用不相交集合的UNION与FIND算法以及使用一个不同的方法来确定部分解的可行性。

如果J是作业的可行子集,那么可以使用下述规则来确定这些作业中的处理时间:若还没给作业I分配处理时间,则分配给它时间片[a-1,a],其中a应尽量取大且时间片[a-1,a]是空的。

所以在将作业一个一个地装配到J中时,就不必为接纳新作业而移动J中已分配了时间片的作业。

(一)算法描述
给定一批作业X={x,x,…,x},对每个i,与x相关联的d>0和p〉O,d是x的时间期限,p 是xi的收益,di和pi都是整数,1WiWn.
1.对X={x1,x2,…,xn}中的元素按pi的非增序重新排列得到{xi1,xi2,…,xin},把新的序列仍记为{x1,x2,…,xn},这时有p1三p2三…三pn.
2.令d=max{di1WiWn},再令b=min{n,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中的第三步,直到结束
(二)算法实现
lineprocedureFLS(D,n,b,j,k)
//找最优解J=J(1)……,J(k)//
//假定P1三P2三P3,b=min{n,max{D(i)}}//
intergeb,D(n),J(n),F(0:b),P(0:b)
Fori・0tondo
F(i)—I;P(i)J—1
repeat
k—0
fori・1to0do
j—FIND(min(n,D(i))
辻F(j)M0thenk・k+1;J(k)
l・FIND(F(j)-l);callUNION(l,j)
F(j)-F⑴endif
repeatendFJS
(三)算法分析
在1中,对X={xl,x2,…,xn}按pi的非增序重新排序,若用快速排序法,其平均时间复杂度为o(nlogn)
在2中,考察每一个xi,1WiWn,需调用一次Find,总共调用Find的次数Wn,总共调用Union的次数1WbWn.所以其时间复杂度近似于o(nlogn).
综合以上分析,无论采用什么排序算法,整个有限期作业调度算法其时间复杂度不低于o (nlogn)
三.改进算法
(一)改进策略典型算法利用优先策略很好的解决了有限期作业安排问题。

但由于采取顺序查找方式定位,平均查找长度较大,并且需要进行移动操作,效率较低.改进算法的基本思想是:对每一个任务Ji(1WiWn)来说,其首选插入位置k为其满足期限要求的最迟时间(即k=di).如果Pk空闲则将其插入,否则说明已有一利润更大的任务安排在此,应向前搜索(因为只有安排在期限内才能获利);在搜索过程中,找到空闲位就将其插入;若搜索结束仍未找到有空闲位,则将任务Ji舍去.
设已安排任务集合SP={J1,J2…Ji-1},当前任务为Ji,未安排任务集合SJ={Ji+1,Ji+2…Jn}•若任务Ji能够插入到集合SP中,对于JiuSJ,必有Ci三Cj,且Ji处在其期限的边界位置,所以能够保证Ji不再被移动;若插入失败,对于Ji丘SP,必有Cp三Ci,所以任务Ji必被舍弃.
通过缩小搜索空间来进一步优化算法•设置左边界指针h用以纪录搜索终止位置,其初值为
1.当某个任务Ji(1WiWn被放弃时,则说明在输出数组P的前di个节点都已经被安排,则以后没有必要再次搜索,所以下次搜索的终点为di+1(即h-di+1).设置右边界指针t用以标识当前任务Ji的最优搜索起始位置,初始值为n.对于任务Ji来说,其最大安排期限不可能大于n,所以若存在di〉n,则令其插入预选位置k为t,同时修改t.
(二)算法描述
1.假设用数组J存储任务,用数组C存储利润,用数组d存储期限,用数组P存储安排好的任务。

按照利润从大到小的次序,调整任务的次序:
对n个任务J1,J2,...,Jn进行调整,使其满足C1三C22...三Cn.
2.将排序后的任务顺次插入输出数组P.
A)对t和h设初值:h=1;t=n;
B)令任务J[i]的首选插入位置k为d[i];
C)插入过程:
i)若k小于h,则放弃J[i](因为前h个位置已有任务插入),则转B)处理下一任务;ii)若k大于t,则令k等于t(因为只有前t个位置才有可能进行插入),并使t减1; iii)若P[k]为空(即此时还没有任务安排在此),则将J[i]插入到此位置,则转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++)P[i]=0;
h=1;t=n;
i=1;k=d[i];
while(i<=n)
{if(k<h){h=max(h,d[i]+1);
i++;
k=d[i];
continue;
}
if(k>=t){k=t;
t--;
}
if(P[k]==0){P[k]=i;
i++;
k=d[i];
}
elsek--;
}
output(P,J,n)}
(四)算法分析
对任一任务Ji(lWiWn),其在输出数组P中位置的确定,传统算法采用顺序查找,每次从当前的最后位置依次向前查找,随着被插入任务的增加,查找长度愈来愈大;并且插入任务时需要移动若干已插入的任务,算法效率低.
改进算法采用哈希存储的思想,当哈希函数的设置合适时,大多数情况下能够直接命中,从而减少了查找长度,并且避免了移动.在任务安排的过程中,前一阶段由于已插入元素较少,发生冲突的机率较小;随着插入任务的增多,冲突逐渐发生,查找长度增大.由于引入了边界指针,当发生越界时边界指针被修改,引起搜索空间逐步缩小,搜索长度既而开始变小.传统算法的移动操作与查找操作是同数量级的,改进算法由于采用边界拟合插入,从而避免了移动操作,提高了算法效率。

相关文档
最新文档