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()
运行结果:
最后:
不得不说,Python真的舒服~