作業排程問題深度搜尋定界演算法

2021-04-07 13:23:44 字數 2524 閱讀 3971

深度搜尋定界

設有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...