流水車間調度算法分析的簡單+Leapms實踐--混合整數規划的啟發式建模
清華大學出版社出版的白丹宇教授著作《流水車間與開放車間調度算法漸近分析》采用漸近分析方法分析多個NP-難類啟發調度算法的收斂性,學術性很強。
本帖用數學規划模型方法對比精確模型和啟發模型之間的差異,從實踐角度感覺啟發算法的魅力。本帖的要點如下:
1。有人說數學規划模型是精確方法。其實廣義地講,數學規划模型也可以是啟發算法,只要你對問題進行啟發建模就行。
2。啟發建模會犧牲求解精確性,但是對NP-難問題來說,由於對大規模問題的精確解很難獲得,啟發算法或啟發建模是必須的。
3。當測試算法時,原始數據經常是隨機生成的,最好能把數據的生成簡潔地寫進模型,那么測試就簡單多了。
流水車間調度問題
假設有m個機器,n個工件,已知每個工件在不同機器上的加工時間,求如何排序工件在不同機器上的加工次序使得總完工時間最短(以此目標為例)。
流水車間調度的精確模型
設x[i][j] 為工件j 在機器i上的開始加工時間,設c為總完工時間,於是目標是:
min c
c肯定大於任何工件在任何機器上的完成時間:
c>=x[i][j]+T[i][j] | i=1,..,m;j=1,..,n
把工件 j 在機器 i 上的加工時間設置為T[i][j]。
對兩個工件 j1,j2, j1$\neq$ j2,在同一台機器上的加工時間不可以沖突,即:
x[i][j2]>=x[i][j1]+T[i][j1] - M(1-u[i][j1][j2])|i=1,..,m;j1=1,..,n;j2=1,..,n;j1<j2 x[i][j1]>=x[i][j2]+T[i][j2] - M*u[i][j1][j2] | i=1,..,m;j1=1,..,n;j2=1,..,n;j1<j2
對同一個工件j, 其在兩台不同機器 i1,i2, i1 $\neq $ i2上加工的時間不能沖突,即:
x[i2][j]>=x[i1][j]+T[i1][j] - M(1-v[i1][i2][j])| i1=1,..,m;i2=1,..,m;j=1,..,n;i1<i2 x[i1][j]>=x[i2][j]+T[i2][j] - M*v[i1][i2][j] | i1=1,..,m;i2=1,..,m;j=1,..,n;i1<i2
說明一下引入的常量和變量:
where m,n are integers M is a number c is a variable of number T[i][j] is a number|i=1,..,m;j=1,..,n x[i][j] is a variable of nonnegative number|i=1,..,m;j=1,..,n u[i][j1][j2] is a variable of binary|i=1,..,m;j1=1,..,n;j2=1,..,n;j1<>j2 v[i1][i2][j] is a variable of binary|i1=1,..,m;i2=1,..,m;j=1,..,n;i1<>i2
提供計算得來的數據,注意T[i][j]是用隨機函數隨機生成的0-100之間的數:
data_relation T[i][j]=rand(100)|i=1,...,m;j=1,...,n M=sum{i=1,..,m;j=1,..,n}T[i][j]
提供數據,這里設m=3使得問題NP-難,n=100規模足夠大:
data m=3 n=100
總體的模型:
//x[i][j] -- start time of job j on machine i min c subject to c>=x[i][j]+T[i][j] | i=1,..,m;j=1,..,n x[i][j2]>=x[i][j1]+T[i][j1] - M(1-u[i][j1][j2])|i=1,..,m;j1=1,..,n;j2=1,..,n;j1<j2 x[i][j1]>=x[i][j2]+T[i][j2] - M*u[i][j1][j2] | i=1,..,m;j1=1,..,n;j2=1,..,n;j1<j2 x[i2][j]>=x[i1][j]+T[i1][j] - M(1-v[i1][i2][j])| i1=1,..,m;i2=1,..,m;j=1,..,n;i1<i2 x[i1][j]>=x[i2][j]+T[i2][j] - M*v[i1][i2][j] | i1=1,..,m;i2=1,..,m;j=1,..,n;i1<i2 where m,n are integers M is a number c is a variable of number T[i][j] is a number|i=1,..,m;j=1,..,n x[i][j] is a variable of nonnegative number|i=1,..,m;j=1,..,n u[i][j1][j2] is a variable of binary|i=1,..,m;j1=1,..,n;j2=1,..,n;j1<>j2 v[i1][i2][j] is a variable of binary|i1=1,..,m;i2=1,..,m;j=1,..,n;i1<>i2 data_relation T[i][j]=rand(100)|i=1,...,m;j=1,...,n M=sum{i=1,..,m;j=1,..,n}T[i][j] data m=3 n=100
流水車間調度的啟發模型
使用這個啟發: 讓在機器上加工時間較小的任務早些執行。即同一個機器上工件不沖突約束改變為:
x[i][j2]>=x[i][j1]+T[i][j1] |i=1,..,m;j1=1,..,n;j2=1,..,n;j1<j2;T[i][j1]<T[i][j2] x[i][j1]>=x[i][j2]+T[i][j2] | i=1,..,m;j1=1,..,n;j2=1,..,n;j1<j2;T[i][j1]>=T[i][j2]
總體模型是:
//x[i][j] -- start time of job j on machine i min c subject to c>=x[i][j]+T[i][j] | i=1,..,m;j=1,..,n x[i][j2]>=x[i][j1]+T[i][j1] |i=1,..,m;j1=1,..,n;j2=1,..,n;j1<j2;T[i][j1]<T[i][j2] x[i][j1]>=x[i][j2]+T[i][j2] | i=1,..,m;j1=1,..,n;j2=1,..,n;j1<j2;T[i][j1]>=T[i][j2] x[i2][j]>=x[i1][j]+T[i1][j] - M(1-v[i1][i2][j])| i1=1,..,m;i2=1,..,m;j=1,..,n;i1<i2 x[i1][j]>=x[i2][j]+T[i2][j] - M*v[i1][i2][j] | i1=1,..,m;i2=1,..,m;j=1,..,n;i1<i2 where m,n are integers M is a number c is a variable of number T[i][j] is a number|i=1,..,m;j=1,..,n x[i][j] is a variable of nonnegative number|i=1,..,m;j=1,..,n v[i1][i2][j] is a variable of binary|i1=1,..,m;i2=1,..,m;j=1,..,n;i1<>i2 data_relation T[i][j]=rand(100)|i=1,...,m;j=1,...,n M=sum{i=1,..,m;j=1,..,n}T[i][j] data m=3 n=100
對比試算
將兩個模型調入+Leapms環境中進行解析。
精確模型有3061個變量和30600個約束:
啟發模型有901個變量,15750個約束:
兩者不僅是變量和約束數字的差異,關鍵是模型結構上的差異。
在+Leapms中使用cplex命令呼叫 CPLEX求解:
精確模型在筆者能忍受的時間內求不到精確解,兩分鍾之后的最好解是5715, gap 96%,這樣大的gap很難降下來。剛剛幾乎死機,趕緊殺掉進程,保護本帖。
啟發模型呼叫CPLEX后瞬間被求解,最優解4904。
關於漸進性的進一步實驗統計得換m,n值慢慢算,有時間的再全面試下,該吃飯了,先下了。最后貼下兩個模型的PDF摘錄。
兩個模型的PDF摘錄: