使用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_listk1[i],t_listk[i1]}+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])
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值