带期限的作业调度问题的算法与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2010-2011 第二学期08通信专业
期末考查带期限的作业调度问题的算法与实现班级08通信一班学号14082300943姓名张博成绩分
一、设计目的
1.掌握分枝-限界法算法的解题的基本思想和设计方法;
2.理解分枝-限界法算法中的限界函数应遵循正确,准确,高效的设计原则;
3.掌握先进先出分枝-限界算法思想(FIFOBB)解决带期限作业调度问题。
二、设计内容
1.任务描述
给定一个带期限的作业排序问题, n=5, (p1,p2,p3,p4,p5)=(6,3,4,8,5),
(t1,t2,t3,t4,t5)=(2,1,2,1,1), (d 1,d2,d3,d4,d5)= (3,1,4,2,4), 应用FIFOBB求使总罚款数最小的可行作业集J, 要求:
1)阐述c’(X)和u(X)的设计思路,U的初始值;
2)针对解向量变长格式, 画出FIFOBB的生成的部分状态空间树, 按活节点生成顺序给节点编号,在各节点位置给出c’(X)和U的值,给每条边标记选择的作业编号;
3)阐述c’(X)=U的处理方案, 可行解的判断方案;
4)阐述你程序中的主要数据类型、数据变量和功能模块。
5)、编成并上机实现FIFOBB程序, 实现对不同作业排序问题实例的求解,问题实例的输入数据存储在case.txt文件中,其格式为:
第一行问题规模(最多10个作业)
第二行各作业的罚款数,数据项之间用一个空格分隔
第三行各作业的截止期限,数据项之间用一个空格分隔
第四行各作业所需的运行时间,数据项之间用一个空格分隔
例如:
4
5 10
6 3
1 3
2 1
1 2 1 1
从屏幕直接输出最优作业集的序号,数据项之间用逗号分隔。
三、设计思路
1.几个关键数据的处理
1)c'的设计思路是总共结点总成本减去当前结点的成本再减去其最小成本上界的成本。
2)在处理计算最小成本上界时,我利用了一个数组binGroup2,给它初始化为{1,1,1,1,1},设计每个结点结构体都有一个这样的数组,每个结点做了那个作业就把对应作业的二进制数制为0;在计算最小估计成本上界时就将这个数组乘以结点成本数组,然后循环求和。
3)c’(X)=U的处理方案:U取初值一个很大的
2.状态空间树: 方框:
椭圆表示结点; 作业:1 2 3 4 5 六边形表示死结点。
作业:2 3 4 5 3 4 5 4 5 5
作业:3 4 5 4 5 5 4 5 5 5
作业:5
1 11 10 9 8 7 1
2 6 5 4
3 2 16
15 14 13 19
22 23 24 26 25
估计成本: 最小上界: 17,17
18,18 21, 21 13,
18
9,
22 6, 23 0,
26
7,
12 3, 16 0, 17 13,
13
15, 15 9,
14
10,
15 6, 19 0,
20 12,
12
7, 7 6, 11
14,
14
10,
10
6, 11
17 27
21 20
18
3.主要数据类型与变量
Int max;//罚款总数
int cost[5]={6,3,4,8,5};//罚款
int timeconsumer[5]={2,1,2,1,1};//所用时间
int declitime[5]={3,1,4,2,4};//截止期限
#define e 0.1
Int U;//存放最小成本
typedef struct aa
{
int parent;//父亲结点
int x;//表示节点所做的任务几
int binGroup1[4]={0,0,0,0,0};//记录做了的作业,把做了的作业记为1
int binGroup2[5]={1,1,1,1,1};//记录没有做的作业,把做了的作业记为0
int time;//记录耗时总和
int maycost;//估计成本
float mincost;//最小成本上界
} ELEM;//节点当前任务,日期,估计成本,最小上界成本
ELEM Node[N];//存放活结点数组
4.算法或程序模块
int maycost(Elemt X) 功能:计算估计成本maycost函数
int Mincost(int x[5],int y[5]) 功能:计算最小上界mincost成本,即二进制数组2乘以成本数组
int comparetime(int x[5],int y[5],int z[5]) 功能:计算总耗时间与最大截止期限做比较void entergroup(int w,int E) 功能:活结点进队列
int outgroup(int E) 功能:活结点出队列
void BB(int T) 功能:在所有的结点中寻找最小成本
四、测试
1.方案
建立一个文本文档case.txt与程序放在同一个文件目录下。
在里面写入:
4
5 10
6 3
1 3
2 1
1 2 1 1
2.结果
理论结果是作业1,4,5,作用最小罚款数是7。