#include
using
namespace
std;
//最小堆的插入與刪除
template
class minheap
int size() const
minheap& insert(const t& x);
minheap& deletemin(t &x);
private:
int currentsize, maxsize;
t *heap;
};template
minheap::minheap(int maxheapsize)//建構函式 沒有返回值型別
template
minheap& minheap::insert(const t& x)//返回型別是minheap
int i = ++currentsize;
while(i != 1 && x < heap[i/2])
heap[i] = x;
return *this;
}template
minheap& minheap::deletemin(t& x) //返回型別是minheap
x = heap[1];
t y = heap[currentsize--];
int i = 1, ci = 2;
while(ci <= currentsize)
if(y <= heap[ci])
heap[i] = heap[ci];
i = ci;
ci *= 2;
}heap[i] = y;
return *this;
}//開始作業排程
class flowshop;
class minheapnode
private:
void init(int);
void newnode(minheapnode,int,int,int,int);
int s, //已安排作業數
f1, //機器1上最後完成時間
f2, //機器2上最後完成時間
sf2, //當前機器2上完成時間和
bb, //當前完成時間和下界
*x; //當前作業排程
};class flowshop
;template
inline
void swap(type &a, type &b);
int main()
,,};
int **m = new
int*[n];
int **b = new
int*[n];
int **a = new
int*[n];
bool **y = new
bool*[n];
int *bestx = new
int[n];
for(int i=0;i<=n;i++)
cout
<<"各作業所需要的處理時間"
<<" 機器1 機器2 "
}for(int i=0;icout
<<"作業"
<1
<<":";
for(int j=0;j<2;j++)
cout
<" ";
cout
<1000;//給初值
flow.bbflow();
cout
<<"最少花費是:"
<<"最優解空間是:";
for(int i=0;icout
<<(flow.bestx[i]+1)<<" ";
}cout
delete b[i];
delete a[i];
delete y[i];
}return0;}
//最小堆節點初始化
void minheapnode::init(int n)
//最小堆新節點
void minheapnode::newnode(minheapnode e,int ef1,int ef2,int ebb,int n)
//對各作業在機器1和2上所需時間排序 排序成非遞減
void flowshop::sort(void)}}
for(int i=0; idelete c;
}//計算完成時間和下界
int flowshop::bound(minheapnode e,int &f1,int &f2,bool **y)
}for(int k=0; k<=e.s; k++)
}f1 = e.f1 + m[e.x[e.s]][0];
f2 = ((f1>e.f2)?f1:e.f2)+m[e.x[e.s]][1];
int sf2 = e.sf2 + f2;
int s1 = 0,s2 = 0,k1 = n-e.s,k2 = n-e.s,f3 = f2;
//計算s1的值
for(int j=0; jif(!y[j][0])
s1 += f1+k1*b[j][0];}}
//計算s2的值
for(int j=0; jif(!y[j][1])
}//返回完成時間和下界
return sf2 +((s1>s2)?s1:s2);
}//解批處理作業排程問題的優先佇列式分支限界法
int flowshop::bbflow(void)
else
//產生當前擴充套件節點的兒子節點
swap(e.x[e.s],e.x[i]);
}delete e.x;//完成節點擴充套件
}if(h.size() == 0)
h.deletemin(e);//取下一擴充套件節點
}return bestc;
}template
inline
void swap(type &a, type &b)
批處理作業排程 分支限界法
一 問題描述 給定 n 個作業的集合 j 每乙個作業 j i 都有兩項任務分別在兩台機器上完成。每乙個作業必須先由機器1 處理,然後由機器2處理。作業 j i 需要機器 j 的處理時間為 t j i 其中i 1,2,n,j 1,2。對於乙個確定的作業 排程,設f j i 是作業 i 在機器 j 上的...
演算法作業 批處理作業排程 回溯 分支限界法
問題描述 給定 n 個作業的集合 j 每乙個作業 j i 都有兩項任務分別在兩台機器上完成。每乙個作業必須先由機器1 處理,然後由機器2處理。作業 j i 需要機器 j 的處理時間為 t j i 其中i 1,2,n,j 1,2。對於乙個確定的作業 排程,設f j i 是作業 i 在機器 j 上的完成...
佈線問題 分支限界法
佈線問題就是在 m n 的方格陣列中,指定乙個起點 a 乙個終點 b,要求找到起點到終點的最短佈線方案 最短路徑 搜尋從起點 a 開始,到目標點 b 結束。約束條件 有邊相連且未成佈線。搜過過程 從起點 a 開始,將其作為乙個擴充套件結點,沿 a 的上 下 左 右 4 個方向的相鄰結點擴充套件。判斷...