1. 算法描述
令
N
1
=
{
i
∣
a
i
<
b
i
}
N_1 = \{i | a_i < b_i \}
N1={i∣ai<bi},
N
2
=
{
i
∣
a
i
≥
b
i
}
N_2 = \{ i| a_i \geq b_i\}
N2={i∣ai≥bi};将
N
1
N_1
N1中的作业按照
a
i
a_i
ai的非降序排列,将
N
2
N_2
N2中的作业按照
b
i
b_i
bi的非升序排列;
N
1
N_1
N1中的作业拼接
N
2
N_2
N2中的作业构成
J
o
h
n
s
o
n
Johnson
Johnson算法的最优作业调度。
2. C/C++代码实现
#include<iostream>
#include<algorithm>
using namespace std
;
const int maxn
= 1000;
class JobType {
public:
int key
;
int index
;
bool job
;
bool operator < (const JobType
& j
)const {
return key
< j
.key
;
}
};
int FlowShop(int n
, int a
[], int b
[], int c
[])
{
JobType
* d
= new JobType
[n
];
for (int i
= 0; i
< n
; i
++)
{
d
[i
].key
= a
[i
] < b
[i
] ? a
[i
] : b
[i
];
d
[i
].job
= a
[i
] < b
[i
];
d
[i
].index
= i
;
}
sort(d
, d
+ n
);
int j
= 0;
int k
= n
- 1;
for (int i
= 0; i
< n
; i
++)
if (d
[i
].job
)
c
[j
++] = d
[i
].index
;
else
c
[k
--] = d
[i
].index
;
cout
<< "流水作业调度序列为:";
for (int i
= 0; i
< n
; i
++)
cout
<< c
[i
] << " ";
cout
<< endl
;
j
= a
[c
[0]];
k
= j
+ b
[c
[0]];
for (int i
= 1; i
< n
; i
++)
{
j
+= a
[c
[i
]];
k
= j
< k
? k
+ b
[c
[i
]] : j
+ b
[c
[i
]];
}
delete[]d
;
return k
;
}
int main()
{
int n
;
cin
>> n
;
int a
[maxn
], b
[maxn
], c
[maxn
];
for (int i
= 0; i
< n
; i
++)
cin
>> a
[i
] >> b
[i
];
int t
= FlowShop(n
, a
, b
, c
);
cout
<< "流水作业调度最短完成时间是:" << t
<< endl
;
return 0;
}
3. 运行结果
5 2 5 4 2 3 3 6 1 1 7 流水作业调度序列为:4 0 2 1 3 流水作业调度最短完成时间是:19
4. 具体动态规划推导过程
具体推导过程
转载请注明原文地址:https://blackberry.8miu.com/read-9273.html