M[x[j]][1];
f1 += M[x[j]][0];
f2[i] = ((f2[i - 1] > f1) ? f2[i - 1] : f1) +
f += f2[i];
}
if (f < bestf) {
Swap(x[i], x[j]);
Backtrack(i + 1);
Swap(x[i], x[j]);
}
f1 -= M[x[j]][0];
f -= f2[i];
}
}
}
void Flowshop1::Swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
Flowshop2::Flowshop2(int **M, int n)
{
this->M = M;
this->n = n;
b = new int *[n];
a = new int *[n];
bestc = (~(unsigned int)0) >> 1; // 最小完成时间和
for (int i=0; i
Sort();
this->BBFlow();
}
Flowshop2::~Flowshop2()
{
for (int i=0; i}
delete []a;
delete []b;
delete []bestx;
}
int Flowshop2::getBestf()
{
return bestc;
}
int *Flowshop2::getBestx()
{
return bestx;
}
void Flowshop2::BBFlow(void)
{
priority_queue
, cmp> H;
MinHeapNode E(n);
while (true)
{
if (E.s == n) { // 叶结点
if (E.sf2 < bestc) {
bestc = E.sf2;
for (int i=0; idelete []E.x;
if (H.empty()) {
printf("\tMin Heap Empty \n"); // 报错
break;
}
else {
E = H.top();
H.pop();
}
}
while (!H.empty()) {
delete []H.top().x;
H.pop();
}
}
int Flowshop2::Bound(MinHeapNode &E, int &f1, int &f2)
{ // 计算完成时间和下界
int j, k;
bool **y = new bool *[n]; // 工作数组
for (k=0; k
E.f2) ? f1 : E.f2) + M[E.x[E.s]][1];
int sf2 = E.sf2 + f2;
// 机器和机器的作业顺序不一样
// 分别都先运行时间短的, 而假设其可以运行
// s1: 假设机器很快很快
// s2: 假设机器很快很快
// 原则是使估计得到的下界尽可能的大
int s1 = 0, k1 = n - E.s, f3;
for (j=0; jif (!y[j][0]) {
k1--;
if (k1 == n - E.s - 1) // 找到的第一个
f3 = (f2 > f1 + b[j][0]) ? f2 : f1 + b[j][0];
s1 += f1 + k1 * b[j][0]; // 假设作业在机器上顺序执行
并无时间间隔
}
}
int s2 = 0, k2 = n - E.s;
for (j=0; j s2) ? s1 : s2);
}
void Flowshop2::Sort(void)
{ // 对各作业在机器和上所需时间排序
int *c = new int[n];
int i, j, k;
for (j=0; j<2; j++) {
for (i=0; ii; k--) {
if (b[k - 1][j] > b[k][j]) { // 结果为从小到大
Swap(b[k - 1][j], b[k][j]);
Swap(c[k - 1], c[k]);
}
}
}
for (i=0; i