流水車間調度算法分析的簡單+Leapms實踐--混合整數規划的啟發式建模


流水車間調度算法分析的簡單+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摘錄:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM