想要合并数据,数据情况大致如下
最旧的:min
空值:null 改成isnull非空
思路就是这样
编码:
如上面的编码表示工件1的第一道和第二道工序在机器1和4上加工,后面依次类推。
如果需要工序编码随机生成,可以做如下操作:
job=[1,1,1,2,2,3,3,4,4]
np.random.shuffle(job)
2、解码
解码的核心简单来说:安排一道工序的加工:1、需要找到该工序的的上一道工序的完工时间(当然,作为工件的第一道工序不用考虑),2、找到该工序的加工机器当前加工任务的完工时间。两者取最大值即可。核心代码如下:
if(worktime[0,int(work[0,i])]>0):
startime=max(worktime[0,int(work[0,i])],tmm[0,j])
tmm[0,j]=startime+workmachinetime[0,i] worktime[0,int(work[0,i])]=startime+workmachinetime[0,i]
if(worktime[0,int(work[0,i])]==0):
startime=tmm[0,j]
tmm[0,j]=startime+workmachinetime[0,i]
worktime[0,int(work[0,i])]=startime+workmachinetime[0,i]
startime、tmm、worktime、workmachinetime
分别表示工序开工时间、机器完工时间、工件到当前工序的完工时间、工序在机器上的加工时间。Worktime
等于0表示是工件的第一道工序。
3、可视化(甘特图):
解码时把各个工序的开工、加工、完工时间、加工等信息记录下来,画图也就比较容易。记录信息的代码如下:
if(worktime[0,int(work[0,i])]>0):
startime=max(worktime[0,int(work[0,i])],tmm[0,j])
tmm[0,j]=startime+workmachinetime[0,i]
worktime[0,int(work[0,i])]=startime+workmachinetime[0,i]
if(worktime[0,int(work[0,i])]==0):
startime=tmm[0,j]
tmm[0,j]=startime+workmachinetime[0,i]
worktime[0,int(work[0,i])]=startime+workmachinetime[0,i]
tmmw[0,j]+=workmachinetime[0,i]
break
上面例子的信息及甘特图如下:
本文代码已经写好,只用自己在excel表输入编码即可,如果希望在代码里进行操作,在下面的位置进行手动输入,需要注意的是,工序、机器、加工时间编码的数据形式都是二维数组。
if __name__=='__main__':
a,b,c,p1,p2,work_number,mach_number,scale_ls,index_ls,x1=getinformation()#x1是excel表的内容,可以print对照看
#a,b,c,p1,p2,work_number,mach_number分别是工序编码,机器编码,加工时间,工件数,机器数
print(a)