深度搜尋定界
設有n臺處理機p1,p2,......pn,和m個作業j1,j2,...jm,處理機可並行工作,作業未完成不能中斷,作業ji在處理機上的處理時間為ti,求解最佳方案,使得完成m項工作的時間最短?
本文用c++實現,方便c/c++讀者。
上界定得很鬆:
g_dmaxtime = g_drestjobtime;
所以速度會慢一點。
可以應用迭代加深使搜尋更快。
即開始時將上界定為最緊:
g_drestjobtime / g_nprocessor
搜尋不成功再迭代放寬上界。
沒有儲存作業分配方案,只有時間值。
深度搜尋定界
例2:設定有n臺處理機p1,p2,......pn,和m個作業j1,j2,...jm,處理機可並行工作,作業未完成不能中斷,作業ji在處理機上的處理時間為ti,求解最佳方案,使得完成m項工作的時間最短?
說明:本題有兩重搜尋法,搜尋處理機和搜尋作業,當m,n較大時,搜尋處理機不可能?搜尋作業容易確定上下界,容易剪支。
若輸入檔案是:
3 6
11 7 5 5 4 7
輸出結果如下:
7 75 5 4
11time=14
*/#include
#include
#include
#include
#include
#include
using namespace std;
// input parameters
int g_nprocessor;
int g_njob;
typedef vectord_vec;
d_vec g_vjobtime;
// end of input parameters
// search state
double g_dmaxtime;
typedef vectorbool_vec;
bool_vec g_vjobdone;
int g_icurproc; // as search depth
d_vec g_vprocusedtime;
double g_drestjobtime;
// end of search state
void preparesearch()
void readparams()
}bool addjob(int ijob)
void deljob(int ijob)
/*return false if add job bounce the limit:
1. g_vprocusedtime descend
2. g_vprocusedtime[1] less than maxtime
*/bool canaddjob(int ijob)
// assign nfromjob..max to current processor
// go next proc if all job tried.
void searchfromjob(int ifromjob)
/* / debug
cout << "curproc " << g_icurproc
<< " : search from job " << ifromjob << endl;
cout << "job done list: ";
copy(g_vjobdone.begin(), g_vjobdone.end(),
ostream_iterator(cout, " "));
cout << endl;
cout << "proc used time: ";
copy(g_vprocusedtime.begin(), g_vprocusedtime.end(),
ostream_iterator(cout, " "));
cout << endl;
*/for (int i = ifromjob; i < g_njob; i++)
// current proc assigned, search from next proc
int nprocrest = g_nprocessor - 1 - g_icurproc;
double dmaxresttime = nprocrest * g_vprocusedtime[g_icurproc];
if (dmaxresttime < g_drestjobtime)
return; // stop this branch
g_icurproc++;
searchfromjob(0);
g_icurproc--;
}int main(int argc, char *argv)
流水作業排程問題
流水作業排程問題 n個作業在2 臺機器上m1和 m2組成的流水線上完成加工。每個作業加工的順序都是先在 m1上加工,後在 m2上加工。在兩臺機器上加工的時間分別為ai和 bi。解 流水作業排程 根據johnson法則 使用結構體陣列f1 j 存放a i 使用結構體陣列f2 k 存放a i b i 的...
流水作業排程問題
n個作業在2臺機器上m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,後在m2上加工。在兩臺機器上加工的時間分別為ai和bi。目標 確定這n個作業的加工順序,使得從第一臺作業開始加工,到最後一個作業完成加工所需要的時間最少。假設要對集合s中的作業進行加工,當m1開始加工時,假設...
流水作業排程問題
n個作業要在由2臺機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為a i 和b i 流水作業排程問題要求確定這n個作業的最優加工順序,使得從第一個作業在機器m1上開始加工,到最後一個作業在機器m2上加工完成所需的時間最...
批處理作業排程問題
name 批處理作業排程問題 author 巧若拙 date 17 07 17 14 12 description 問題描述 給定n個作業,集合j j1,j2,j3 每一個作業ji都有兩項任務分別在2臺機器上完成。每個作業必須先有機器1處理,然後再由機器2處理。作業ji需要機器j的處理時間為tji。...
流水作業排程問題
有n個作業要在兩臺機器m1和m2組成的流水線上完成加工。每個作業i 都必須先花時間ai 在m1上加工,然後花時間bi 在m2上加工。求解n個作業的加工順序,使得總的加工時間最短。最優排程 讓m1沒有空閒,m2的空閒時間儘量短。設s1 為 a b的作業集合,s2為 a b 的作業集合,將s1的作業按a...