带时限的作业排序问题
算法-带有期限的作业排序问题

姓名:
学号:
问题解析(对问题的分析、解题思路与解题方法):
对当前正在考虑的作业,按限期大小采用一种“插入排序”的方式,尝试将其“插入”到一个按限期从小到大顺序构造的作业调度序列中,以此判断是否能够合并到当前部分解J中。如果可以,则插入到序列中,形成新的可行解序列。否则,舍弃该作业。
r--;
if(d[J[r]] <= d[i] && d[i]>r)
{
for(int j=k; j>r; j--)
J[j+1] = J[j];
J[r+1] = i;
k++;
}
}
return k;
}
fjs算法:
int FJS(int *D,int n,int b,int *J,int *Q)
{
int i,*F,*P,j,I,m,k;
具体如下:假设n个作业已经按照效益值从大到小的次序,即p1>=p2...>=pn的顺序排列好,每个作业可以在单位时间内完成,并具有相应的时间期限;且至少有一个单位时间可以执行作业:
首先,将作业1存入部分解J中,此时J是可行的;
然后,依次考虑作业2到n。假设已经处理了i-1个作业,其中有K个作业计入了部分解J中:J(1),J(2),...,J(K),且有
if(F[j]!=0)
{
k=k+1;
J[k]=i;
Q[F[j]]=i;
m=F[j];
I=FIND(P,F[j]-1);
UNION(P,I,j);
F[j]=F[I];
}
}
return k;//返回最优解的个数
}
(陈慧南 第3版)算法设计与分析——第6章课后习题答案

⑥ 选择作业 1,则 X 6, 2,3,5,1 。将其按照期限 di 非减次序排列可
得:
ID
di
5
1
6
2
3
3
1
3
2
4
作业5
作业3 作业2
-1
0
1
2
3
4
作业6 作业1(冲突)
该集合无可行排序,因此 X 6, 2,3,5,1 不可行, X 6, 2,3,5 ;
3
⑦ 选择作业 0,则 X 6, 2,3,5, 0 。将其按照期限 di 非减次序排列
可得:
ID
di
5
1
0
1
6
2
3
3
2
4
作业5
作业3 作业2
-1
0
1
2
3
4
作业0(冲突)作业6
该集合无可行排序,因此 X 6, 2,3,5, 0 不可行,X 6, 2,3,5 ;
⑧ 选择作业 4,则 X 6, 2,3,5, 4 。将其按照期限 di 非减次序排列
可得:
ID
Hale Waihona Puke di516
12,5,8,32, 7,5,18, 26, 4,3,11,10, 6 。请给出最优存储方案。
解析:首先将这 13 个程序按照程序长度非降序排列,得:
程序 ID
9 8 1 5 12 4 2 11 10 0 6 7 3
程序长度 ai 3 4 5 5 6 7 8 10 11 12 18 26 32
根据定理可知,按照程序编号存放方案如下:
解析:已知 Prim 算法时间复杂度为 O n2 ,受顶点 n 影响;
Kruskal 算法时间复杂度为 O m logm ,受边数 m 影响;
使带权总完工时间为最小的自由作业排序问题

Op = , ur c,0 1 te 巧 1 。te j 2 = , r I te ∑ I I p e ∑ , l
j l = j =l
O j 1 mP = , 1 i
0p = 1 I I ∑
j =1
可以看 出,这些结论大都是在单位加工时 间的假设条件下得 到的。本文将 在一般 情形下研究 问
基金项目:国家 自然科学基金重大国际 ( 地区) 合作研究 (03 101) 77 16 05;江苏省教育厅 ( 63 ) 江苏省 “ y 07 w0 青
篮 ”工 程 .
第4 期
陈荣军,唐国春 :使带权总完工时间为最小的 自由作业排序 问题
61 3
均极小 NP困难 ;而下面几个 问题为极大 多项式 时间可解 ,即这些 问题本身是多项式时间可解 的,但略微一般 的情况都不是多项式时间可解 的【6。 4】 —
j =1
其 中 , Mi 别 表 示 工 件 歹 C 分 和 的 完 工 时 间 ,w , j WMi 工 件 和 机 器 的 权 ,J 示 工 为 表
件,i 表示机器。 与 自由作业相关 的大部分 问题 是 N P困难 的,只有少数情形是 多项式时 间可解 的 。当机器 数为两 台时 ,Acu b e C i[ 证 明 h g u hn ] 。
总完 工 时 间 为最 小 的 两类 问题 ,本 文 用 组 合方 法 或 者 数 学规 划 方 法 分 别给 出 了稠 密 时 间表 的算 法 或 者 置 换排 序 的算 法 , 并分 析 算 法 的 性 能 比 。此 方法 在 理 论 和应 用 两 方 面 都 是 有 意义 的 。
关键词:排序 ; 自由作业 ;带权总完工时间;性能 比
题o l n j 的多项式时间近似算法。另外,在 日 a 一 r I W 常生活中,人们也常常希望机器尽早 ∑
时限调度算法给出的调度顺序

时限调度算法给出的调度顺序时限调度算法是一种常用的任务调度算法,它主要用于在有限的时间内,合理地安排多个任务的执行顺序,以提高系统的效率和性能。
本文将介绍时限调度算法的基本原理和常见的调度顺序。
一、先来了先服务(FCFS)调度顺序先来了先服务(First-Come-First-Served)调度顺序是最简单的一种调度算法,它按照任务到达的先后顺序进行调度。
当一个任务到达后,系统就立即执行它,直到任务结束或发生阻塞。
这种调度顺序的优点是简单易实现,但缺点是无法根据任务的重要程度和紧急程度进行优先级调度,容易导致低优先级任务长时间等待。
二、最短作业优先(SJF)调度顺序最短作业优先(Shortest-Job-First)调度顺序是根据任务的执行时间长度进行调度的算法。
当多个任务同时到达时,系统会选择执行时间最短的任务先执行。
这种调度顺序的优点是能够最大程度地减少平均等待时间,提高系统的响应速度。
然而,它也存在着一定的缺点,即可能导致长任务的饥饿问题,即长任务可能一直等待短任务执行完毕而得不到执行。
三、优先级调度顺序优先级调度顺序是根据任务的重要程度和紧急程度进行调度的一种算法。
每个任务都有一个优先级,优先级越高的任务越先执行。
这种调度顺序能够根据任务的紧急程度进行调度,保证重要任务得到及时处理。
然而,它也存在着可能导致低优先级任务长时间等待的问题,因此需要合理设置任务的优先级。
四、时间片轮转(RR)调度顺序时间片轮转(Round-Robin)调度顺序是一种基于时间片的调度算法,它将每个任务分配一个固定长度的时间片,当一个任务的时间片用完后,系统会将其放入等待队列,并执行下一个任务。
这种调度顺序能够公平地分配系统资源,避免某个任务长时间占用资源,但也可能导致任务的响应时间较长。
五、最早截止时间优先(EDF)调度顺序最早截止时间优先(Earliest-Deadline-First)调度顺序是根据任务的截止时间进行调度的一种算法。
两类带时限的作业排序问题

两类带时限的作业排序问题第1题带时限的作业排序问题问题描述:设有⼀个单机系统、⽆其它资源限制且每个作业运⾏相等时间,不妨假定每个作业运⾏ 1 个单位时间。
现有 n 个作业,每个作业都有⼀个截⽌期限di>0,di 为整数。
如果作业能够在截⽌期限之内完成,可获得 pi>0 的收益。
问题要求得到⼀种作业调度⽅案,该⽅案给出作业的⼀个⼦集和该作业⼦集的⼀种排列,使得若按照这种排列次序调度作业运⾏,该⼦集中的每个作业都能如期完成,并且能够获得最⼤收益。
输⼊:第⼀⾏输⼊ n 的值,以下 n ⾏输⼊作业号 i,收益 pi,截⽌期限 di。
输出:n 个作业的⼀个最优⼦集。
⽰例:输⼊:41 100 22 10 13 15 24 27 11 4输出: 0 0 1 1第2题带时限的作业排序问题II问题描述:带时限的作业排序问题可描述为:设有 n 个作业和⼀台处理机,每个作业所需的处理时间、要求的时限和收益可⽤三元组(pi, di, ti),0<=i<n 表⽰,其中,作业 i 的所需时间为 ti,如果作业 i 能够在时限 di 内完成,将可收益 pi,求使得总收益最⼤的作业⼦集 J。
输⼊:第⼀⾏输⼊ n 的值;第⼆⾏输⼊ pi;第三⾏输⼊ di;第四⾏输⼊ ti (i=0,…,n-1 且作业已经按时限⾮减次序排列)。
输出:xi(⽤固定长度 n-元组 xi 表⽰,xi=0 或 1,i=0,…,n-1)。
⽰例:输⼊:45 36 101 12 31 1 1 2输出: 0 0 1 1第1题思路分析这题的思路⽐较明显,就是每次都选取作业收益最⼤的,并把它放在允许的最⼤的截⽌时间内完成,符合贪⼼算法的基本思想。
将输⼊的每个作业按收益从⼤到⼩进⾏排序,⽤⼀个数组vis表⽰某时刻是否已经有作业正在运⾏,vis[i]=1,表⽰时间i被占⽤。
然后从第1个作业开始往后搜索,将该作业安排到vis[d]时间运⾏,如果d已经有安排,将从d-1开始往前搜索,直到找到⼀个未被占⽤的时间点。
带时间延迟的极小化总完工时间的单机排序问题

带时间延迟的极小化总完工时间的单机排序问题胡觉亮;王焕男;蒋义伟【摘要】研究工件带有两道工序的单台机排序问题.在该问题中,工件的第一道工序先于第二道工序加工,并且第二道工序的开工时间与第一道工序的完工时间至少间隔一定的延迟时间,目标是极小化所有工件的总完工时间.文章考虑所有工件相同且两道工序的加工时间均为单位时间的情形.通过引入k-连续加工的概念和分析最优解的性质,根据延迟时间的大小,分别设计了两个算法并证明了算法所得的排序为最优排序.【期刊名称】《浙江理工大学学报》【年(卷),期】2014(031)001【总页数】5页(P83-87)【关键词】单台机;时间延迟;总完工时间;算法设计与分析;最优排序【作者】胡觉亮;王焕男;蒋义伟【作者单位】浙江理工大学理学院,杭州310018;浙江理工大学理学院,杭州310018;浙江理工大学理学院,杭州310018【正文语种】中文【中图分类】O233本文主要研究带延迟时间的单机排序问题。
每个工件Jj有两道工序aj和bj,第一道工序先于第二道工序加工,第一道工序的完工时间与第二道工序的开工时间之间至少存在lj个单位时间延迟,也就是说第二道工序至少等待lj个单位时间才能开工。
此类问题在一些产品制造工艺流程、布匹印染和服装订单的生产中有重要的应用背景。
对于带有延迟的排序问题,主要分为两类,一类是工件Jj前后两道工序的延迟时间恰好为lj,本文称之为精确延迟排序;另一类是两道工序间的延迟时间至少为lj,称之为至少延迟排序。
关于精确延迟的排序问题,Orman等[1]证明了单台机的一些特殊情况是多项式可解的,并证明即便所有工序的加工时间相同,该问题还是强NP-难的。
Leung等[2]利用贪婪算法研究延迟非增的情形,给出了问题F2|,aj=a,bj=b,a≥b|∑Cj的最优排序,并对问题F2|,aj=a,bj=b,a<b|∑Cj给出了一个2-近似算法。
Ageev等[3]分别研究了单台机和两台流水作业机器问题的一些近似算法。
带有限期的作业排序

带有限期的作业排序问题的描述:带有期限的作业排序要解决的是操作系统中单机、无资源约束且每个作业可在等量的时间内完成的作业调度问题。
把这个问题形式化描述为:①要在一台机器上处理n个作业,每个作业可以在单位时间内完成②每个作业i都有一个期限值d i,d i>0③当作业在它规定的期限值前完成,就可以获得的效益p i,p i>0问题求解的目标是:问题的可行解是这n个作业的一个子集合J。
J中的每个作业都能在各自的截止期限前完成后,产生一个作业效益之和。
我们的目标就是找到一个子集J,J中的每个作业都能在各自的截止期限前完成,并且使得作业效益值的和最大。
这个作业的一个子集合J就是所求的最优解。
带有期限的作业排序的一个例子:例3.2 n=4,(p1,p2,p3,p4)=(100,10,15,20),(d1,d2,d3,d4)=(2,1,2,1)。
这个问题的最优解为第7个,所允许的处理顺序是:先处理作业4,在处理作业1。
在时间0开始处理作业4而在时间2完成对作业1的处理。
可行解处理顺序效益值1 {1} 1 1002 {2} 2 103 {3} 3 154 {4} 4 205 {1,2} 2,1 1106 {1,3} 1,3或3,1 1157 {1,4} 4,1 1208 {2,3} 2,3 259 {3,4} 4,3 35带有期限的作业排序贪心算法度量标准的选取:我们的目标是作业效益值的和最大,因此首先把目标函数作为度量标准。
首先把作业按照它们的效益值作一个非增次序的排序。
以例3.2来说,作业根据效益值排序后为作业1、4、3、2。
求解时首先把作业1计入J,由于作业1的期限值是2,所以J={1}是一个可行解。
接下来计入作业4。
由于作业4的期限值是1而作业1的期限值是2,可以先完成作业4后再完成作业1,所以J={1, 4}是一个可行的解。
然后考虑作业3,但是作业3的期限值是2,计入J后就没有办法保证J中的每一个作业都在期限值内完成,因此计入作业3后不能构成一个可行解。
贪心法-带有限期的作业排序

贪⼼法-带有限期的作业排序问题描述–假定在⼀台机器上处理n个作业,每个作业均可在单位时间内完成;同时每个作业i都有⼀个截⾄期限di>0,当且仅当作业i在其截⾄期限以前被完成时,则获得pi>0的效益。
–问题:求这n个作业的⼀个⼦集J,其中的所有作业都可在其截⾄期限内完成。
——J是问题的⼀个可⾏解。
–可⾏解J中的所有作业的效益之和是 i<j∑Pi,具有最⼤效益值的可⾏解是该问题的最优解。
⽬标函数:–约束条件:所有的作业都应在其期限之前完成–分析如果所有的作业期限“⾜够宽松” ,⽽使得多有作业都能在其期限之内完成,则显然可以获得当前最⼤效益值;否则,将有作业⽆法完成——决策应该执⾏哪些作业,以获得最⼤可能的效益值。
n=4,(p1,p2,p3,p4)=(100,10,15,20)和(d1,d2,d3,d4)=(2,1,2,1)。
可⾏解如下表所⽰:问题的最优解是⑦。
所允许的处理次序是:先处理作业4再处理作业1。
量度标准:下⼀个要计⼊的作业将是使得在满⾜所产⽣的J是⼀个可⾏解的限制条件下让得到最⼤增加的作业。
处理规则:按pi的⾮增次序来考虑这些作业。
procedure JS(D,J,n,k)//D(1),…,D(n)是期限值。
n≥1。
作业已按p1≥p2≥…≥pn的顺序排序。
J(i)是最优解中的第i个作业,1≤i≤k。
终⽌时, D(J(i))≤D(J(i+1)), 1≤i<k//integer D(0:n),J(0:n), i, k, n, rD(0)←J(0)←0 //初始化//k←1;J(1)←1 //计⼊作业1//for i←2 to n do //按p的⾮增次序考虑作业。
找i的位置并检查插⼊的可⾏性//r←kwhile D(J(r))>D(i) and D(J(r)) ≠r do r←r-1 repeatif D(J(r))≤D(i) and D(i)>r then //把i插⼊到J中//for i←k to r+1 by -1 doJ(i+1) ←J(i) //将插⼊点的作业后移⼀位//repeatJ(r+1) ←i;k←k+1endifrepeatend JS#include <iostream>using namespace std;/*D(1),…,D(n)是期限值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<stdio.h>
#include<malloc.h>
int FIND(int *parent,int i)
{//查找含有元素i的树根,使用压缩规则去压缩由i到根j的所有结点int j,k,t;
j=i;
while(parent[j]>0) j=parent[j];//找根
k=i;
while(k!=j){//压缩由i到根j的结点
t=parent[k];
parent[k]=j;
k=t;
}
return j;
}
void UNION(int *parent,int i,int j)
{//使用加权规则合并根为i和j的两个集合
int x;
x=parent[i]+parent[j];
if(parent[i]>parent[j]){//i的结点少
parent[i]=j;
parent[j]=x;
}
else{//j的结点少
parent[j]=i;
parent[i]=x;
}
}
int MIN(int n,int m)
{//求n和m的最小值
if(n>m) return m;
else return n;
}
int FJS(int *D,int n,int b,int *J,int *Q)
{//找J(n)的最优解,并返回最优解的个数
int i,*F,*p,j,l,m,k;
F=(int *)malloc((b+1)*sizeof(int));
p=(int *)malloc((b+1)*sizeof(int));
for(i=0;i<=b;i++){//将树置初值
F[i]=i;
p[i]=-1;
}
k=0;//初始化J
for(i=1;i<=n;i++)
{//使用贪心规则
j=FIND(p,MIN(n,D[i]));
if(F[j]!=0)
{//选择作业i
k=k+1;
J[k]=i;
Q[F[j]]=i;
m=F[j];
l=FIND(p,F[j]-1);
UNION(p,l,j);
F[j]=F[l];
}
}
return k;//返回最优解的个数
}
int MAXMUM(int i,int j)
{//求i和j的最大值
if(i>j) return i;
else return j;
}
int MAX(int *D,int i, int j)
{//D(1:n)是含有n个元素数组,求出D(i,j)中的最大值并返回int max,mid,max1,max2;
if(i==j) max=D[i];
else
if(i==j-1)
if(D[i]<D[j]) max=D[j];
else max=D[i];
else{
mid=(i+j)/2;
max1=MAX(D,i,mid);
max2=MAX(D,mid+1,j);
max=MAXMUM(max1,max2);
}
return max;
}
void Insertionsort(int *D,int n)
{//将D中的元素按非增次序分类
int j,item,i;
D[0]=65525; //设置监视哨
for(j=2;j<=n;j++){
item=D[j];
i=j-1;
while(item>D[i]){
D[i+1]=D[i];
i=i-1;
}
D[i+1]=item;
}
}
void main()
{
int *D,*J,*Q,*p,n,b,i,k;
printf("\n *******************用贪心法解决带有限期的作业排序问题************************\n");
printf("\n请输入作业的数目:\n");
scanf("%d",&n);
D=(int*)malloc((n+1)*sizeof(int));
p=(int*)malloc((n+1)*sizeof(int));
printf("\n请输入每个作业的效益值(%d个):",n);
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
Insertionsort(p,n);
printf("\n按效益值非增排序后各作业为:\n");
printf("\n作业序号效益值\n");
for(i=1;i<=n;i++)
printf("J%d %d\n",i,p[i]);
printf("\n");
printf("\n请输入按效益值非增排序后各作业的截止时间(%d个):",n);
for(i=1;i<=n;i++)
scanf("%d",&D[i]);
b=MIN(n,MAX(D,1,n));
J=(int*)malloc((b+1)*sizeof(int));
Q=(int*)malloc((b+1)*sizeof(int));
for(i=1;i<=b;i++)
Q[i]=-1;
k=FJS(D,n,b,J,Q);
printf("\n\n************************本问题的最优解*****************************\n\n");
printf("\n作业序号效益值\n");
for(i=1;i<=k;i++)
printf("J%d %d\n",J[i],p[i]);
printf("\n\n************************各作业的执行次序******************************\n");
printf("\n作业序号效益值\n");
for(i=1;i<=b;i++)
if(Q[i]!=-1)
printf("J%d %d\n",Q[i],p[i]);
printf("\n\n");
}。