使用Python计算甘特图所需要总时长,并绘制甘特图
作者:互联网
甘特图计算实例
1.实例情况分析
-
假设有n个工件;
-
假设有m个工位;
-
假设工时矩阵 W t W_t Wt(n,m),其中 W t [ i ] [ j ] W_t[i][j] Wt[i][j]表示第i个工件在第j个工位的加工时间, W t [ i ] [ j ] ≥ 0 W_t[i][j]\geq0 Wt[i][j]≥0;
-
上述模型可用Gantt图进行表示,如下图:
图中五种颜色分别代表了一个工件,纵坐标1-6表示在编号为1-6上各动子的加工情况,横坐标表示加工时间;
2. 模型求解
-
约束条件:
- 工件i在工位k上加工时要等待工位k上的工件i-1加工结束;
- 工件i在工位k上加工时要先完成工位k-1上的加工;
- 总加工时长 = 最后一个工件在最后一个工位加工结束的时刻 - 开始时刻;
-
求解方法:
- 通过迭代求解,迭代计算
- 计算第1个工位每个工件加工完成后各自的时刻,储存为 t l i s t t_{list} tlist(n);
- 计算第2个工位上每个工件加工完成时刻,计算过程应遵循上述约束;
- ……
- 计算第n个工位上的各工件加工完成时刻,最后一个工件加工完成即得加工总时长;
- 数学描述:
t _ l i s t 1 = w t [ 1 ] [ : ] t _ l i s t k [ i ] = m a x { t _ l i s t k − 1 [ i ] , t _ l i s t k [ i − 1 ] } + w t [ i ] [ k ] \begin{aligned} t\_list_1 &= w_t[1][:] \\ t\_list_k[i] &= max\{t\_list_{k-1}[i],t\_list_k[i-1]\}+w_t[i][k] \end{aligned} t_list1t_listk[i]=wt[1][:]=max{t_listk−1[i],t_listk[i−1]}+wt[i][k]
- 通过迭代求解,迭代计算
3. 程序实现
def gantt_compute_nonimage(n,m,wt,color_list):
'''
n:工件数
m:工位数
wt:工作矩阵
color_list:代表动子的颜色矩阵
'''
t = np.zeros(n)
for i in range(m):
for j in range(n):
if j == 0:
t[j] = t[j] + wt[j][i]
else:
t[j] = max(t[j],t[j-1]) + wt[j][i] #这里与数学描述不同是因为采用直接赋值覆盖
return(t[-1])
- 绘制图形代码如下:
def gantt_compute(n,m,wt,color_list):
'''
n:动子数
m:工位数
wt:工作矩阵
color_list:代表各工件的颜色矩阵
'''
t = np.zeros(n)
for i in range(m):
for j in range(n):
if j == 0:
t[j] = t[j] + wt[j][i]
plt.barh(y=i+1,width=wt[j][i],left=t[j]-wt[j][i],height=1,color=color_list[j])
else:
t[j] = max(t[j],t[j-1]) + wt[j][i]
plt.barh(y=i+1,width=wt[j][i],left=t[j]-wt[j][i],height=1,color=color_list[j])
if(wt[j][i] != 0):
pass
#plt.text(t[j]-wt[j][i]/2,i+1,"wt_%d%d=%.2f"%(i+1,j+1,wt[j][i]),horizontalalignment="center",verticalalignment="center")
for i in range(n):
plt.barh(y=0,width=t[-1]/n,left=t[-1]/n*i,height=0.5,color=color_list[i])
plt.text((i+0.5)*t[-1]/n,0,'n=%d'%(i+1),horizontalalignment="center",verticalalignment="center")
plt.plot([t[-1],t[-1]],[-0.5,m+1],color=(0,0,0))
x_tickss = [i for i in range(0,int(t[-1]),int((t[-1]/4)//10)*10)]
if(t[-1]-x_tickss[-1]<(int((t[-1]/4)//10)*10)/4):
x_tickss.pop()
x_tickss.append(t[-1])
plt.title('n=%d,m=%d,need_time=%.3f'%(n,m,t[-1]))
plt.xticks(x_tickss)
#plt.savefig('./image/n%d_m%d_'%(n,m)+time.strftime("%Y%m%d%H%M%S", time.localtime()))
#plt.clf()
#print(t)
return(t[-1])
标签:工位,加工,Python,总时长,list,甘特图,color,wt,工件 来源: https://blog.csdn.net/lqwh4666/article/details/113576130