算法设计与分析课程大作业Word文件下载.docx
- 文档编号:17190548
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:11
- 大小:121.93KB
算法设计与分析课程大作业Word文件下载.docx
《算法设计与分析课程大作业Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法设计与分析课程大作业Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
作业调度;
动态规划;
贪心算法;
回溯法;
一。
动态规划算法解决流水作业调度
1、问题描述
给定n个作业,每个作业有两道工序,分别在两台机器上处理.一台机器一次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。
一个作业只有在机器1上得处理完成以后才能由机器2处理.假设已知作业i在机器j上需要得处理时间为t[i,j]。
流水作业调度问题就就是要求确定一个作业得处理顺序使得尽快完成这n个作业.
2、算法分析
直观上,一个最优调度应使机器M1没有空闲时间,且机器M2得空闲时间最少。
在一般情况下,机器M2上会有机器空闲与作业积压2种情况。
在一般情况下,机器M1开始加工S中作业时,机器M2还在加工其她作业,要等时间t后才可利用。
将这种情况下完成S中作业所需得最短时间记为T(S,t).流水作业调度问题得最优值为T(N,0)。
由流水作业调度问题得最优子结构性质可知,
(1)
(2)
从公式
(1)可以瞧出,该问题类似一个排列问题,求N个作业得最优调度问题,利用其子结构性质,对集合中得每一个作业进行试调度,在所有得试调度中,取其中加工时间最短得作业做为选择方案。
将问题规模缩小.
公式(2)说明一般情况下,对作业集S进行调度,在M2机器上得等待时间,除了需要等该部件在M1机器上完成时间,还要冲抵一部分原来得等待时间,如果冲抵已成负值,自然仍需等待M1将作业做完,所以公式取max{t—ai,0}。
3.算法得描述
从分析可知,流水作业调度问题一定存在满足Johnson法则得最优调度,且容易由下面得算法确定.
流水作业调度问题得Johnson算法:
(1)令;
(2)将中作业依得非减序排列;
将中作业依得非增序排列;
作业接种作业构成满足Johnson法则得最优调度。
4、部分算法实现
intFlowShop(intn,inta[],intb[],int c[])
{int i;
Jobtype*d=newJobtype[n];
ﻩfor( i=0;
i〈n;
i++)
ﻩ{
ﻩﻩd[i]、key= a[i]>
b[i]?
b[i]:
a[i];
//按Johnson法则分别取对应得b[i]或a[i]值作为关键字
ﻩﻩd[i]、job=a[i]<
=b[i];
//给符合条件a[i]〈b[i]得放入到N1子集标记为true
d[i]、index = i;
}
BubbleSort(d,n);
//对数组d按关键字升序进行排序
intj= 0,k=n—1;
for( i=0;
i〈n;
i++)
{
ﻩif(d[i]、job)
ﻩ{
c[j++]= d[i]、index;
ﻩﻩ//将排过序得数组d,取其中作业序号属于N1得从前面进入
ﻩ}
ﻩelse
ﻩ{c[k--]=d[i]、index;
//属于N2得从后面进入,从而实现N1得非减序排序,N2得非增序排序
ﻩ}
}
j= a[c[0]];
ﻩk=j+b[c[0]];
for(i=1;
i<n;
ﻩ{
ﻩﻩj +=a[c[i]];
ﻩ//M1在执行c[i]作业得同时,M2在执行c[i-1]号作业,最短执行时间取决于M1与M2谁后执行完
ﻩk=j<
k?
k+b[c[i]]:
j+b[c[i]];
//计算最优加工时间
ﻩdeleted;
returnk;
}
5. 运行结果
6、时空效率分析
算法Flowshop得主要计算时间花在对作业集得排序上.在这里,我们使用冒泡排序法(BubbleSort),因此,在最坏情况下算法FlowJob所需要得计算时间为。
所需要得空闲显然就是.
二。
贪心算法解多机调度问题
1、问题描述
多机调度问题要求给出一种作业调度方案,使所给得n个作业在尽可能短得时间内由m台机器加工处理完成。
约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理.作业不能拆分成更小得子作业.这个问题就是NP完全问题,到目前为止还没有有效得解法。
对于这一类问题,用贪心选择策略有时可以设计出较好得近似算法。
2、算法分析
贪心算法只需按顺序以数组方式提供各作业得加工时间与机器得台数;
求出作业得个数,若小于机器台数,就将作业逐个分配给就近得机器,所需要得加工时间,即为最长作业所需时间。
若作业数大于机器台数,将作业按加工时间得多少降序排序,以机器数建立最小堆,先将前m个作业分配给m个机器,最小堆顶就是最小得元素(即m个作业中加工时间最少得作业),将其移出并加上后续作业得加工时间,再插入堆,这时会改变原来得状态,升到堆顶得机器加工总时间最少,它再移出加后续作业得加工时间,在插入堆,依此类推,直到全部作业结束。
堆中得最大值就就是完成所有作业所需得最短时间。
3、部分算法实现
typedefstructNode
{ intID,avail;
}manode;
//ID机器编号 avail每次作业得初始时间
ﻩmanodemachine[N];
jobnodejob[N];
ﻩ /* 找出下个作业执行机器 */
manode* Find_min(manodea[], intm)
ﻩ{ manode*temp= &
a[0];
ﻩfor(inti=1;
i<m;
i++)
{if (a[i]、avail<
temp—〉avail)
temp=&
a[i];
}
returntemp;
/*对作业时间由大到小进行排序*/
ﻩ voidSort(jobnodet[],intn)
{jobnodetemp;
for(inti= 0;
i〈n- 1;
for (intj=n-1;
j>
i;
j——)
ﻩ{ if(job[j]、time〉job[j-1]、time)
ﻩ { temp=job[j];
ﻩ job[j]=job[j—1];
ﻩ job[j-1]= temp;
ﻩ}
ﻩ}
ﻩvoidmain()
{
for(i= 0;
i〈n;
i++)
{ cin>
〉job[i]、time;
job[i]、ID=i+1;
}
printf("
输入机器数目(机器编号按输入顺序处理)\n"
);
cin>〉m;
for(i =0;
i〈m;
i++)//给机器进行编号并初始化
{machine[i]、ID=i+ 1;
machine[i]、avail=0;
putchar('
\n');
if(n<=m)
{printf("为每个作业分配一台机器,可完成任务!
\n"
);
return;
}
Sort(job,n);
for (i=0;
i<
n;
i++)
{ ma=Find_min(machine, m);
printf("
将机器:
M%d从%d-〉 %d得时间段分配给作业:
%d\n"
,
putchar(’\n’);
printf("
该批作业处理完成所需加工时间为:
%d\n", temp);
4、计算复杂性分析
当n≤m时,所有作业可以一次安排给各机器,算法greedy需要o(1)时间。
当n〉m时,排序耗时O(nlogn).初始化堆需要O(m)时间。
关于堆得removeMin与put运算共耗时O(nlogm),因此算法greedy所需得计算时间为O(nlogn+nlogm)=O(nlogn)。
5.运行结果
三.回溯法解决批作业调度问题
1、问题描述
输入:
1、
任务数N
2、
机器数M
3、
随机序列长度t[i],其中t[i]=x表示第i个任务完成需要时间单位x,
输出:
1、
开销时间besttime,表示最佳调度需要时间单位
最佳调度序列bestx[],其中bestx[i]=x,表示将第i个任务分配给第x个机器执行.
2、算法思想
解空间得表示:
一个深度为N得M叉树。
t[i]:
第i个任务得时间
x[i]=j:
当前输出结果
Res[i]=j:
表示第i个任务要运行在第j台机器上
time_machine[i]:
第i个机器上得运行时间
基本思路:
1、搜索从开始结点(根结点)出发,以DFS搜索整个解空间.
2、每搜索完一条路径则记录下time_min与Res[i]序列,开始结点就成为一个活结点,
同时也成为当前得扩展结点。
在当前得扩展结点处向纵深方向移至一个新结点,
并成为一个新得活结点,也成为当前扩展结点。
3、如果在当前得扩展结点处不能再向纵深方向扩展,则当前扩展结点就成为死结点。
此时,应往回移动(回溯)至最近得一个活结点处,并使这个活结点成为当前得扩展
结点;
直至找到一个解或全部解。
3.部分算法实现
boolplacetest(int k)
{int time_max_K= time_machine[1];
for(inti=2;
i<
=K;
i++)
ﻩ{if(time_machine[i] >
time_max_K )
ﻩtime_max_K =time_machine[i];
if(time_max_K> time_min)
returnfalse;
ﻩelse
ﻩreturntrue;
}
voidBacktrack(intk,intt[],intx[])
{if(k〉N)
{inttime_max_K=time_machine[1];
ﻩfor(inti=2;
i++)
ﻩﻩ{if(time_machine[i]〉time_max_K)
ﻩtime_max_K=time_machine[i];
ﻩ}
if(time_max_K〈time_min)
ﻩ{time_min=time_max_K;
ﻩﻩfor(int i=1;
=N;
ﻩRes[i] = x[i]}}
ﻩelse
ﻩ{for(inti=1;
=K;
ﻩﻩ{x[k] =i;
//将第k个任务放到第i个机器上面
ﻩﻩif( placetest(k) )
{
ﻩtime_machine[i]+= t[k];
ﻩﻩBacktrack(k+1,t,x);
ﻩﻩtime_machine[i]—= t[k];
ﻩﻩ}
}
4、运行结果
5、时间复杂性分析
由于没有使用限界函数进行优化,算法时间与空间复杂度呈指数级增长。
所以该算法不适合较大规模得计算。
蓝线表示机器数一定M=3时,n增大时求解最佳调度对所消耗得时间,该趋势随着指数增加.
作业调度算法比较
在流水作业调度中,Johnson算法这就是在只有两台设备情况下得最优排序算法,同时说明工件得第一道工序与最后一道工序得加工时间对排序得影响就是主要得。
求出作业得个数,若小于机器台数,就将作业逐个分配给就近得机器,所需要得加工时间,即为最长作业所需时间复杂度为O(nlogn)。
回溯算法解决批作业调度问题与前面两个问题不同,前两个就是求所有作业在M2机器上加工完成得最后时间,而这里要求得就是求所有作业在机器M2上完成处理时间得总与达到最小。
这种调度算法可用于计算加工费用。
批处理作业调度问题属于排列树得解空间问题,因此时间复杂度为Ω(n!
)
五.课程学习总结
算法分析与设计就是一门非常重要得课程,很多问题得解决,程序得编写都要依赖它,算法得学习对于培养一个人得逻辑思维能力就是有极大帮助得,它可以培养我们养成思考分析问题,解决问题得能力。
但就是算法得学习同时也需要较强得理解能力,有些算法程序不易读懂,这时需要在理解问题得本质上对算法程序进行解读。
在对一个问题进行算法设计时,要了解问题得特点,找到适合得方法才能得到理想得结果。
在本门课程过程中,我深刻体会到算法就是建立在解法基础之上得,就是在某个具体问题解法过程得分析之后,归纳出得解决一类相关问题得程序或步骤;
如果一个具体问题具有代表性,其解法又具有程序性,那么这样得解法也能体现算法思想。
在学习过程中老师起到了极大得引导及指导作用,也让我们明白了在算法学习中我们要多了解一些问题得最新解法及关注算法在实际问题中得应用。
在本次学习过程中还发现了自己得很多不足,在以后得学习中更要弥补不足,要熟练掌握一些算法思想及其应用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 课程 作业