0-背景
臨近畢業答辯,檢測重復率,抽盲審等事宜接踵而至。很不幸,女票抽中盲審。我送助攻,和她一起修改論文,所以,這幾天寫了點代碼,可以整理一下。
多機器作業排序問題很簡單,舉個栗子🌰(從她論文中偷了一張圖,23333),把所有工件,A,B,C,D加工完要用多久?前提是一台機器只能一次加工一個工件。
(1)用時矩陣
| 工件名稱 |
電爐工時/h |
鋼包工時/h |
模鑄工時/h |
修磨工時/h |
| A |
5 |
10 |
7 |
2 |
| B |
10 |
2 |
8 |
9 |
| C |
3 |
6 |
7 |
8 |
| D |
8 |
10 |
1 |
6 |
| 合計 |
26 |
28 |
23 |
25 |
(2)甘特圖

1-約翰遜算法(johnson)和帕爾默法(palmer)
約翰遜法,又名約翰遜規則,是作業排序中的一種排序方法。這種方法適用的條件是:n個工件經過二、三台設備(有限台設備)加工,所有工件在有限設備上加工的次序相同。
學習效應因子:其實就是熟能生巧,用的加工時間會變少。比如說,第n個在這台機器上加工的零件,那么用時會變為t*(n)^(-a),其中t是原來所用時間,a是學習因子。
主要參考資料是:制造業作業計划與控制
寫了個R的代碼,下面就是,把學習效應因子也考慮進去了。
johnson_learning <- function(car1,a){
library(magrittr)
car1 <- as.data.frame(car1)
rownames(car1) <- letters[1:dim(car1)[1]] # name five machines a,b,c,d,e
colnames(car1) <- paste0('x',1:dim(car1)[2])
res.matrix <- c(rep(0,dim(car1)[1]*dim(car1)[2]))%>%matrix(.,nrow=dim(car1)[1])
#加入學習因子a
#a=0.3
a=-(abs(a))
learning_factor <- seq(1:dim(car1)[1])^(a)
car1_add_learning <- sapply(car1,function(x) x*learning_factor)%>%round(3)
for(i in 1:dim(car1_add_learning )[1]){
# step1: calculate col 1
if(i==1){
res.matrix[i,1] <- car1_add_learning [i,1]
} else {
res.matrix[i,1] <- car1_add_learning [i,1]+res.matrix[i-1,1]
}}
# step 2: calculate row 1
for(m in 1:dim(car1_add_learning)[2]){
if(m==1){
res.matrix[1,m] <- res.matrix[1,1]
} else {
res.matrix[1,m] <- res.matrix[1,m-1]+car1_add_learning [1,m]
}
}
# step 3: matrix
for(x in 2:dim(car1_add_learning )[1]){
for(y in 2:dim(car1_add_learning )[2]){
res.matrix[x,y] <- max(res.matrix[x-1,y]+car1_add_learning [x,y],res.matrix[x,y-1]+car1_add_learning [x,y])
}
}
t <- res.matrix[dim(car1_add_learning )[1],dim(car1_add_learning )[2]]
return(list(a=car1_add_learning ,b=c(a,t),c=res.matrix))
}
約翰遜算法呢是這樣的,你只要給我一個零件的加工順序,我就能給你算出來加工完這些個零件需要多少時間,但是怎樣安排這些零件的加工順序才能使總加工時間最少呢?這個需要用一種啟發式方法,就是palmer法(第49頁),可以得到比較接近最優解的零件排序方案,不一定能得到最優的方案(我試過在Car1上,palmer法並沒有得到最優方案,不過也相當接近最優解了)。
下面是palmer的R代碼
zero.matrix <- matrix(rep(0,dim(car1)[2],nrow=1,byrow=T))%>%t()
colnames(zero.matrix) <- colnames(car1)
for(m in 1:dim(car1)[2]){
for(k in 1:dim(car1)[1]){
zero.matrix[1,m] <- car1[k,m]*(k- ((dim(car1)[1]) +1)/2)+zero.matrix[1,m]
}
}
zero.matrix[,order(zero.matrix[1,])]
2-說說畫圖吧
最近也畫了不少的圖,下面貼一個代碼塊,以后生疏了可以備查。
# car1_res f表示學習因子,min_time表示在此學習因子下,最少用時多久能完工
dat f min_time
car1 -0.152 6619.038
car1 -0.322 6342.673
car1 -0.515 6090.669
car1 -0.737 5864.126
car1 -1.000 5661.767
# plot-2
par(family='STKaiti')
plot(car1_res[,3],type="o",pch=1,cex=1,ann=FALSE,axes=F,ylim=c(5300,7600))
lines(car2_res[,3],type='o',pch=2,cex=1,ann=FALSE)
lines(car4_res[,3],type='o',pch=4,cex=1,ann=FALSE)
lines(car8_res[,3],type='o',pch=8,cex=1,ann=FALSE)
axis(1,at=1:5,lab=c("0.9","0.8","0.7","0.6","0.5"))
axis(2)
box()
legend("topright",c('Car1','Car2','Car4','Car8'),cex=0.8,pch=c(1,2,4,8),lty=1)
title(xlab="學習率l",ylab="最小化最大完工時間")

3-總結
勤動手,多積累,多總結。
2016,加油!
