标签:
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,加油!
标签:
原文地址:http://www.cnblogs.com/litao1105/p/5140420.html