当前位置: 首页 > news >正文

绘制动态甘特图(以流水车间调度为例)

 

 

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
from matplotlib import cm

# 中文字体配置(必须放在所有绘图语句之前)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 时间矩阵数据
jobs = {
    '工件1': [31, 41, 25, 30],
    '工件2': [19, 55, 3, 34],
    '工件3': [23, 42, 27, 6],
    '工件4': [13, 22, 14, 13],
    '工件5': [33, 5, 57, 19]
}

# 初始化变量
machines = ['机器1', '机器2', '机器3', '机器4']
order = list(jobs.keys())
current_time = {m: 0 for m in machines}

# 使用专业色系(参考网页7)
colors = cm.get_cmap('viridis', len(jobs))(np.linspace(0, 1, len(jobs)))

# 计算调度时间表
schedule = []
total_time = 0
for job in order:
    times = jobs[job]
    start_times = []
    end_times = []
    
    for i, (m, t) in enumerate(zip(machines, times)):
        start = max(current_time[m], end_times[-1] if i > 0 else 0)
        end = start + t
        start_times.append(start)
        end_times.append(end)
        current_time[m] = end
    
    total_time = max(total_time, max(end_times))
    schedule.append({'job': job, 'start': start_times, 'end': end_times})

# 创建动态甘特图
fig, ax = plt.subplots(figsize=(12, 6))
ax.set_xlabel('时间')
ax.set_ylabel('机器')
ax.set_yticks(range(len(machines)))
ax.set_yticklabels(machines)
ax.set_title(f'流水车间调度甘特图 | 合计用时:{total_time} 单位')

# 动画初始化函数
def init():
    ax.set_xlim(0, total_time)
    return []

# 动画更新函数(优化颜色绑定)
def update(frame):
    ax.clear()
    ax.set_yticks(range(len(machines)))
    ax.set_yticklabels(machines)
    
    current_total = 0
    for i, s in enumerate(schedule[:frame+1]):
        for m_idx in range(len(machines)):
            start = s['start'][m_idx]
            end = s['end'][m_idx]
            duration = end - start
            ax.broken_barh([(start, duration)], 
                          (m_idx-0.4, 0.8),
                          facecolors=colors[i],
                          edgecolor='black',
                          linewidth=0.5)
            current_total = max(current_total, end)
    
    # 动态创建图例句柄(参考网页6)
    handles = [plt.Rectangle((0,0),1,1, color=colors[i], ec='black') 
              for i in range(frame+1)]
    ax.legend(handles, order[:frame+1], 
             loc='upper right',
             title='加工序列',
             facecolor='#F0F0F0',
             edgecolor='black')
    
    ax.set_title(f'流水车间调度进度({frame+1}/{len(order)})| 当前用时:{current_total} | 总用时:{total_time}')
    return []

# 生成动画(调慢播放速度)
ani = animation.FuncAnimation(
    fig, 
    update, 
    frames=len(order),
    interval=1500,  # 每帧间隔1.5秒
    init_func=init, 
    blit=True, 
    repeat=False
)

plt.show()

http://www.dtcms.com/a/106897.html

相关文章:

  • JWT(JSON Web Token)
  • Spring AI Alibaba 快速开发生成式 Java AI 应用
  • 每日总结4.2
  • 深入理解Python asyncio:从入门到实战,掌握异步编程精髓
  • 为什么你涨不了粉?赚不到技术圈的钱?
  • 教务系统ER图
  • 大模预测法洛四联症的全方位研究报告
  • 特征融合后通道维度增加,卷积层和线性层两种降维方式
  • Ubuntu交叉编译器工具链安装
  • SpringBoot集成OAuth2.0
  • [MySQL初阶]MySQL数据库基础
  • jdk21新特性详解使用总结
  • TypeScript extends 全面解析
  • work02_1 计算这两个日期之间相隔的天数
  • 手机改了IP地址,定位位置会改变吗?
  • Java面试黄金宝典29
  • 蓝桥备赛指南(13):填空签到题(1-1)
  • 车辆控制解决方案
  • 如何通过安当TDE透明加密实现MySQL数据库加密与解密:应用免改造,字段与整库加密全解析
  • MySQL主从复制(四)
  • WEB安全--文件上传漏洞--其他绕过方式
  • OpenLayers:封装Overlay的方法
  • WASM I/O 2025 | MoonBit获Kotlin核心开发,Golem Cloud CEO高度评价
  • 人工智能赋能管理系统,如何实现智能化决策?
  • 操作系统(中断 异常 陷阱) ─── linux第28课
  • 脑影像分析软件推荐 | JuSpace
  • 【kubernetes】pod拉取镜像的策略
  • 关于SQL子查询的使用策略
  • ​自动化网络架构搜索(Neural Architecture Search,NAS)
  • RNN模型与NLP应用——(9/9)Self-Attention(自注意力机制)