C++程序-流水作业调度

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

bool input(); // bool sort();
输入接口 目的是满足 Johnson 不等式
// X=0 or X=1 快速排序 任意 j≥i
min(Bwenku.baidu.com,Aj)≥min(Bj,Ai)
bool sortB(int **b,inti,intj,int X); // X=0; bool sortC(int **c,inti,intj,int X); // X=1; void output(); // 输出计算的最优调度所用的时间
FlowOperation::~FlowOperation() //
析构函数
{ for (inti=0;i<2;i++) { delete []a[i]; delete []b[i]; delete []c[i]; } delete []a; delete []b; delete []c; }
iS
t , t[i,1]} 时间之后才能开工。 由于机器 M 2 上, 作业 i 需在 max{ 因此, 在机器 M 1 上 t , t[i,1]} t[i,1] t[i,2] max{ t t[i,1],0} 时间 完成作业 i 之后, 在机器上还需 t[i,2] max{
才能完成对作业 i 的加工。 按照上面所叙述的递归式,可以设计出解决流水作业调度问题的动态规 划算法。通过对递归式的分析,算法可以得到进一步的改进。
// FlowOperation.h
#ifndef FLOWOPERATION_H #define FLOWOPERATION_H
class FlowOperation { public: FlowOperation(); ~FlowOperation(); void run(); // private: int number; // 流水作业个数 intnumberB; // 记录 N1 的个数 intnumberC; // 记录 N1 的个数 int **a; // int **b; // int **c; // 存储流水作业时间 N1(Ai<Bi) N2(Ai>=Bi) 运行接口
#include <cstdlib> //using std::exit;
#include "FlowOperation.h"
#define N 50
//
预定义有 50 个作业 根据实际情况可作调整
ifstreaminputFile("input.txt",ios::in); ofstreamoutputFile("output.txt",ios::out);
min{ t[a(i),2], t[a(i 1),1]} min{ t[a(i 1),2], t[a(i),1]},1 i n 1 ,称这样的调度 a 为满
足 Johnson 法则的调度。 进一步可以证明,调度 a 满足 Johnson 法则当且仅当对任意的 i 和 j 都 有 i<j 时有 min{t[a(i),2],t[a( j ),1]} min{t[a( j ),2],t[a(i),1]} 。由此可知,任意两个 满足 Johnson 法则的调度均为最优调度。至此,我们将流水调度问题转化 为求满足 Johnson 法则的调度问题。
4. 算法的描述
从上面的分析可知,流水作业调度问题一定存在满足 Johnson 法则的最 优调度,且容易由下面的算法确定。 流水作业调度问题的 Johnson 算法: (1) 令 N1 {i | t[i,1] t[i,2]}, N2 {i | t[i,1] t[i,2]} ; (2) 将 N1 中作业依 t[i,1] 的非减序排列;将 N 2 中作业依 t[i,2] 的非增序排 列; (3) N1 作业接 N 2 种作业构成满足 Johnson 法则的最优调度。 具体的代码在文件夹《流水作业调度——动态规划法》文件夹中。 三、 时空效率分析 算法 FlowJob 的主要计算时间花在对作业集的排序上。在这里,我们 使用冒泡排序法(BubbleSort),因此,在最坏情况下算法 FlowJob 所需要 的计算时间为 O(n log n) 。所需要的空闲显然是 O(n) 。
};
#endif
// FlowOperation.cpp
#include <iostream> using std::endl; using std::ios; using std::cout;
#include <fstream> using std::fstream; using std::ifstream; using std::ofstream;
记 S N {a(1)},则我们可以得到 T ' T (S , t[a(1),2]) 。 事实上,有 T 的定义可知 T ' T (S , t[a(1),2]) .若 T ' T (S , t[a(1),2]) ,设 a ' 是作业 集 S 在 机 器 M 2 的 等 待 时 间 为 t[a(1),2] 情 况 下 的 一 个 最 优 调 度 。 则
因此任意 t 有
max{ t , t[i,1] t[ j,1] t[i,2],t[i,1]} max{ t , t[i,1] t[ j,1] t[ j,2], t[i,1]}
从而, t ij t ji 。由此可见 T (S , t ) T ' (S , t ) 。 换句话说,当作业 i 和作业 j 不满足 Johnson 不等式时,交换它们的加 工顺序后, 作业 i 和作业 j 就满足 Johnson 不等式了, 且不增加加工时间。 由此可得, 对于流水作业调度问题, 必存在一个最优的调度 a, 使得作业 a(i) 和 a(i 1) 满足 Johnson 不等式:
1. 证明流水作业调度问题具有最优子结构
设 a 是所给 n 个流水作业的一个最优调度,它所需要的加工时间为
t[a(1),1] T ' 。 其 中 , T ' 是 在 机 器 M 2 的 等 待 时 间 为 t[a(1),2] 时 , 安 排 作 业 a(2), a(3) , . . . .a .( .n , ) 所需的时间。
a(1), a' (2),.....,a' (n) 是 N
的 一 个 调 度 且 该 调 度 所 需 的 时 间
t[a(1),1] T (S , t[a(1),2]) t[a(1),1] T ' 。这与 a 是 N 的一个最优调度矛盾,所以 T ' T (S , t[a(1),2]) 。 从而 T ' T (S , t[a(1),2]) 。 这就是证明了流水作业调度问题具有
t[i,2],t[i,1]} t[i,1] t[ j,1] max{ t[ j,2],t[i,1]} 从而, t[i,1] t[ j,1] max{ t[i,1] t[ j,1] t[i,2], t[i,1]} max{ t[i,1] t[ j,1] t[ j,2],t[i,1]} 由此可得, max{
3. 流水调度问题的 Johnson 法则
设 a 是作业集 S 在机器 M 2 的等待时间为 t 时的任意一个最优调度。 如果 在调度中,安排在最前面的两个作业分别为 i 和 j,即 a(1) i, a(2) j 。则由 动态规划的递归式可以得到:
T (S , t ) t[i,1] T (S {i}, bi max{ t t[i,1],0}) t[i,1] t[ j,1] T (S {i, j}, tij )
一、 问题描述 给定 n 个作业,每个作业有两道工序,分别在两台机器上处理。一台机器一 次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。一个 作业只有在机器 1 上的处理完成以后才能由机器 2 处理。假设已知作业 i 在机 器 j 上需要的处理时间为 t[i,j]。流水作业调度问题就是要求确定一个作业的 处理顺序使得尽快完成这 n 个作业。 二、 算法分析 n 个作业{1,2,…,n}要在由 2 台机器 M 1 和 M 2 组成的流水线上完成加工。每 个作业加工的顺序都是先在 M 1 上加工, 然后在 M 2 上加工。M 1 和 M 2 加工作业 i 所 需要的时间分别为 t[i,1]和 t[i,2], 1 i n .流水作业调度问题要求确定这 n 个作业的最优加工顺序,使得从第一个作业在机器 M 1 上开始加工,到最后一个 作业在机器 M 2 上加工完成所需的时间最少。 从直观上我们可以看到, 一个最优调度应使机器 M 1 没有空闲时间, 且机器 M 2 的空闲时间是最少。在一般情况下,机器 M 2 上会有机器空闲和作业积压两种情 况。 设全部作业的集合为 N {1,2,....,n} 。 S N 是 N 的作业子集。在一般情况下, 机器 M 1 开始加工 S 中作业时,机器 M 2 还在加工其他作业,要等时间 t 后才能利 用。将这种情况下完成 S 中作业所需的最短时间计为 T ( S , t ) 。流水作业调度问题 的最优解为 T ( N ,0) 。
如果作业 i 和 j 满足 min{t[i,2],t[ j,1]} min{t[ j,2],t[i,1]}, 则称作业 i 和 j 满足 Johnson 不等式。如果作业 i 和 j 不满足 Johnson 不等式,则交换作业 i 和 j 的加工次序后,作业 i 和 j 满足 Johnson 不等式。 在作业集 S 当机器 M 2 的等待时间为 t 时的调度 a 中,交换作业 i 和作业 j 的加工次序,得到的作业集 S 的另一个调度 a’,它所需要的加工时间为
其中, tij t[ j,2] max{ t[i,2] max{ t t[i,1],0} t[ j,1],0}
t[ j,2] t[i,2] t[ j,1] max{max{ t t[i,1],0},0, t[ j,1] t[i,2]} t[ j,2] t[i,2] t[ j,1] max{ t t[i,1], t[ j,1] t[i,2],0} t[ j,2] t[i,2] t[ j,1] t[i,1] max{ t , t[i,1] t[ j,1] t[i,2], t[i,1]}
T ' (S , t ) t[i,1] t[ j,1] T (S {i, j}, t ji ) 。
其中, t ji t[ j,2] t[i,2] t[ j,1] t[i,1] max{ t, t[i,1] t[ j,1] t[ j,2],t[ j,1]} 当作业 i 和 j 满足 Johnson 不等式 min{t[i,2],t[ j,1]} min{t[ j,2],t[i,1]}时,我 们有 max{t[i,2],t[ j,1]} max{t[ j,2],t[i,1]}
FlowOperation::FlowOperation() { number=0; numberB=0; numberC=0;
//
构造函数
a=new int *[N]; b=new int *[N]; c=new int *[N];
for (inti=0;i<N;i++) { a[i]=new int [2]; b[i]=new int [2]; c[i]=new int [2]; } }
最优子结构的性质。
2. 建立递归式计算最优解
由流水作业调度问题的最优子结构的性质我们可以得到,
T ( N ,0) min {t[i,1] T ( N {i}, t[i,2])} 。 推 广 到 更 一 般 的 情 形 , 我 们 便 有 :
1i n
T ( S , t ) min{t[i,1] T ( S {i}, t[i,2] max{ t t[i,1], 0})} 。其中, max{ t t[i,1],0} 这一项是
相关文档
最新文档