目录

Python实现生产过程可视化甘特图

Python实现生产过程可视化(甘特图)

Python实现生产过程可视化(甘特图)

背景:

前文中,通过java写流水车间调度问题的GA算法,因java绘图库过于麻烦,而最终遗传迭代过程图使用Matlab实现。考虑之前接触过Python,且Python做数据分析非常合适,也想着能够重新捡起来Python(许久未用),以后可能会爬一些数据做分析,因此,花了点时间看看语法,并结合前文的结果来使用Python实现流水生产过程的甘特图。

生产调度结果:

承接前文,解析遗传算法得到的流水调度结果,代码如下(java解析):

int m = bestChrome.length;
        int[] result = new int[m];
        for (int i = 0 ; i<m;i++){
            for (int j = 0; j<m;j++){
                if(Arrays.equals(bestChrome[i],initChrome[j])){
                    result[i]=j;
                    break;
                }
            }
        }
        System.out.println("加工顺序->"+Arrays.toString(result));
        int[][] bestTime = CalculateValue.timeChange(bestChrome);
        System.out.println("最优调度时间迭代->");
        Utils.print(bestTime);
        int[][] beginTime = Utils.sub(bestTime, bestChrome);
        System.out.println("开始时间矩阵->");
        Utils.print(beginTime);

得到:最优加工顺序->[7, 3, 4, 0, 2, 5, 6, 1],时间迭代矩阵为:[14 20 43 ,32 39 78 ,42 72 99 ,60 77 129 ,70 102 149 ,82 137 169 ,92 169 186 ,102 189 205 ],各工件各工序开始加工时间矩阵为:[0 14 20,14 32 43 ,32 42 78 ,42 72 99 ,60 77 129 ,70 102 149 ,82 137 169 ,92 169 189],代码中Utils.sub()方法为自定义方法,用于两个矩阵相减。

Python实现甘特图:

原本是打算找个绘图库,能够直接输入数据,输出图形结果的,结果却并不如意,传统甘特图属性太简单,一般库无法实现多项目多任务的时间迭代过程,因此只能考虑自己实现了。这里用图形库matplotlib作为基础,来进一步完成这里所需的多工件多工序的甘特图。具体代码如图,代码过程详细可见注释:

# coding=utf-8
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
add=[[14,6,23],[18,7,35],[10,30,21],[18,5,30],[10,25,20],[12,35,20],[10,32,17],[10,20,16]]
left=[[0,14,20],[14,32,43],[32,42,78],[42,72,99],[60,77,129],[70,102,149],[82,137,169],[92,169,189]]
m = range(len(add))
n=range(len(add[0]))
color = ['b','g','r','y','c','m','k']

#画布设置,大小与分辨率
plt.figure(figsize=(20,8),dpi=80)
#barh-柱状图换向,循坏迭代-层叠效果
for i in m:
    for j in n:
        plt.barh(m[i]+1, add[i][j], left=left[i][j],color=color[j])
plt.title("流水加工甘特图")
labels =[''] *len(add[0])
for f in n:
    labels[f] = "工序%d"%(f+1)
#图例绘制
patches = [ mpatches.Patch(color=color[i], label="{:s}".format(labels[i]) ) for i in range(len(add[0])) ]
plt.legend(handles=patches,loc=4)
#XY轴标签
plt.xlabel("加工时间/s")
plt.ylabel("工件加工优先级")
#网格线,此图使用不好看,注释掉
#plt.grid(linestyle="--",alpha=0.5)
plt.show()

运行结果:

https://i-blog.csdnimg.cn/blog_migrate/4f57c8f75806c6c3eb4a89632f23e44b.png

最后:

不得不说,Python真的舒服~