JOHNSON算法:流水作业最优调度问题

问题描述

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

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

  1. A B = { i ∣ a i < b i } , B A = { i ∣ a i ≥ b i } {AB = \{ i | a_i < b_i\}, BA = \{ i | a_i ≥ b_i \}} AB={iai<bi},BA={iaibi}
  2. A B AB AB中作业依 a i a_i ai的非减次序排列;将 B A BA BA中作业依 b i b_i bi的非增次序排列;
  3. A B AB AB中作业接 B A BA BA中作业即构成满足 J o h n s o n Johnson Johnson法则的最优调度。
#include <stdio.h>
#include <algorithm>
using namespace std;
#define N 8
 
struct 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;
}
@qingdujun
2017-11-30 北京 怀柔

References:
[1] 陈玉福.计算机算法设计与分析,122-123
[2] https://blog.csdn.net/qingdujun/article/details/78674788

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页