流水作业调度问题 Johnson 算法

来源:互联网 发布:张小龙 知乎 编辑:程序博客网 时间:2024/05/22 15:26

问题描述:已知 n 个作业{1, 2, . . . , n}要在由两台机器 M 1 和 M 2 组成的流水线上完成加工。每个作业加工的顺序都是先在 M 1 上加工,然后在 M 2 上加工。M 1 和 M 2 加工作业 i 所需的时间分别为 a i 和 b i ,1≤ i ≤ n。流水作业调度问题要求确定这 n 个作业的最优加工次序,使得从第一个作业在机器 M 1 上开始加工,到最后一个作业在机器 M 2 上加工完成所需的时间最少。


关于流水作业调度问题的以下 Johnson 算法:

(1) 令 AB = { i | a i < b i }, BA = { i | a i ≥ b i } ;
(2) 将 AB 中作业依 a i 的非减次序排列;将 BA 中作业依 b i 的非增次序排列;

(3) AB 中作业接 BA 中作业即构成满足 Johnson 法则的最优调度。


#include <stdio.h>#include <algorithm>using namespace std;#define N 8struct assignment{int a;int b;}asg[N] = {{1,2},{2,4},{3,6},{4,1},{5,7},{6,4},{7,9},{8,3}};bool cmp1(struct assignment x, struct assignment y){if (x.a >= y.a){return true;}return false;}bool cmp2(struct assignment x, struct assignment y){if (x.b <= y.b){return true;}return false;}void johnson(){struct assignment A[N], B[N];int a=0,b=0;for (int i = 0; i < N; ++i){if (asg[i].a < asg[i].b){A[a++] = asg[i];}else{B[b++] = asg[i];}}sort(A,A+N,cmp1);sort(B,B+N,cmp2);for (int i = 0; i < a; ++i){printf("(%d,%d),",A[i].a, A[i].b);}for (int i = 0; i < b; ++i){printf("(%d,%d),",B[i].a, B[i].b);}printf("\n");}int main(int argc, char const *argv[]){johnson();return 0;}


Reference:陈玉福.计算机算法设计与分析,122-123

@qingdujun

2017-11-30 北京 怀柔

原创粉丝点击