有期限的作业调度算法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]

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]]

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)

相关文档
最新文档