所采用案例为高亮老师书《柔性作业车间调度智能算法及其应用》第16页甘特图
import random
import matplotlib.pyplot as plt
plt.rcParams["lines.linewidth"] = 0.5
plt.rcParams["font.sans-serif"] = ["Times new Roman"]
plt.rcParams["font.size"] = 7.5
plt.rcParams["text.color"] = "black"
plt.rcParams["axes.unicode_minus"] = False
COLOUR_BITS = ['1', '2', '3', '4', '5', '6',
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
def colourGen(workpiece: list) -> list:
''' 为每工件对应生成颜色
@param workpiece 工件号
@return colours 各工件对应的颜色列表
'''
colours = []
workpieceNum = len(set(workpiece))
for i in range(workpieceNum):
colourBits = ['#']
colourBits.extend(random.sample(COLOUR_BITS, 6))
colours.append(''.join(colourBits))
return colours
def gantt(macInfo: list, flow: list, macStartTime: list, workpiece: list, operation: list):
''' @param macInfo 对应的机器号 M1=1, M1=2, ...
@param flow 各工序加工时间
@param macStartTime 各工序开始时间
@param workpiece 工件号 J1=1, J2=2, ...
@param operation 操作序号
'''
colours = colourGen(workpiece)
for i, v in enumerate(macInfo):
m = v - 1
plt.barh(m, flow[i], 0.3, left=macStartTime[i],
color=colours[workpiece[i]-1])
plt.text(macStartTime[i] + flow[i] / 8, m, 'J%s.%s' %
(workpiece[i], operation[i]), size=7.5)
if __name__ == "__main__":
MS = [1, 1, 1, 2, 2, 2, 3, 3, 3]
T = [3, 2, 4, 3, 3, 3, 3, 5, 3]
macStartTime = [0, 3, 5, 0, 5, 8, 3, 8, 13]
J = [2, 1, 3, 3, 1, 2, 2, 1, 3]
oper = [1, 1, 2, 1, 2, 3, 2, 3, 3]
# 画图
gantt(MS, T, macStartTime, J, oper)
plt.axvline(x=16.0, c='k', ls='--', lw=0.5) # 参考线
plt.yticks(range(len(set(MS))), ['$M_{1}$', '$M_{2}$', '$M_{3}$'])
plt.show()