批處理作業問題 分支限界法

2021-08-10 03:03:29 字數 3018 閱讀 2474

#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 個方向的相鄰結點擴充套件。判斷...