回溯法求解流水作業排程問題

2021-10-04 01:42:08 字數 1328 閱讀 1418

有n個作業(編號為1~n)要在由兩台機器m1和m2組成的流水線上完成加工。每個作業加工的順序都是先在m1上加工,然後在m2上加工。m1和m2加工作業i所需的時間分別為ai和bi(1≤i≤n)。

流水作業排程問題要求確定這n個作業的最優加工順序,使得從第乙個作業在機器m1上開始加工,到最後乙個作業在機器m2上加工完成所需的時間最少。可以假定任何作業一旦開始加工,就不允許被中斷,直到該作業被完成,即非優先排程。

【輸入格式】輸入包含若干個用例。每個用例第一行是作業數n(1≤n≤1000),接下來n行,每行兩個非負整數,第i行的兩個整數分別表示在第i個作業在第一台機器和第二台機器上加工時間。以輸入n=0結束。

【輸出格式】每個用例輸出一行,表示採用最優排程所用的總時間,即從第一台機器開始到第二台機器結束的時間。

【輸入樣例】

45 6

12 2

4 14

8 70

【輸出樣例】

33採用回溯法求解,對應的解空間是乙個是排列樹,相當於求出n個作業的一種排列使完成時間最少。

作業的編號是1~n。

陣列x作為解向量即排程方案,即x[i]表示第i步執行的作業編號,初始時陣列x的元素分別是1~n。

最優解向量用bestx儲存。

最優解的最優排程時間用bestf表示。

f1陣列:f1[i]表示第i步執行的作業x[i]在m1上執行完的總時間(含前面作業的執行時間)

f2陣列: f2[i]表示第i步執行的作業x[i]在m2上執行完的總時間(含前面作業的執行時間)

由於乙個作業總是先在m1上執行後在m2執行,所以f2[n]就是執行全部作業的總時間。

由於每個作業都是從m1開始的,即m1上各個作業是連續執行的,不需要等待,所以f1不需要用陣列表示,直接用單個變數f1表示。

f2[i-1]>f1:需要等待 f2[i]=f2[i-1]+b[x[i]]

f2[i-1]≤f1:不需等待 f2[i]=f1+b[x[i]]

f1 += a[x[i]];

f2[i]=max(f1,f2[i-1])+b[x[i]];

排列樹遞迴回溯框架:在求乙個方案的同時求其f2[n]時間!

剪枝:求出第i層的f2[i]即執行作業x[i]後的總時間,若f2[i]≥bestf (bestf為當前求出的執行全部作業的最優總時間),就沒有必要從該結點向下擴充套件了,讓其成為死結點,也就是說僅僅擴充套件滿足f2[i]int

bound

(int i)

//求結點的下界值

void

dfs(

int i)

//從第i層開始搜尋

}else

}}該演算法的解空間樹是一棵高度為n的排列樹,對應演算法的時間複雜度為o(n!)。

流水作業排程問題

流水作業排程問題 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上加工完成所需的時間最...