【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现

【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现

请添加图片描述

1 问题

一、问题背景

随着新兴信息技术的大规模应用,工业生产线的智能化控制技术日益成熟。自动生产线

可以自动完成物品传送、物料填装、产品包装和质量检测等过程,极大地提高了生产效率和产品质量,减少了生产成本。自动生产线融入故障智能报警技术,能避免因故障带来的生产中断和经济损失;同时合理的人员配置,能够减少资源浪费、提高生产效率。

二、解决问题

问题 1: 根据附件 1 中的数据,分析生产线中各装置故障的数据特征,构建故障报警模型,实现故障的自动即时报警。

问题 2: 应用问题 1 所建立的模型,对附件 2 中的数据进行分析判断,实现生产线中各装置故障的自动即时报警,给出故障报警的日期、开始时间与持续时长,将结果存放到result2.xlsx 中(格式见表 1,模板文件在附件 2 中),并在论文中给出每条生产线中各装置每月的故障总次数及最长与最短的持续时长。

表 1 result2.xlsx 的格式

故障编号100120016002
序号日期开始时间持续时长/秒日期开始时间持续时长/秒日期开始时间持续时长/秒
135796714792981204751
241648101118379722948248
372094796319711223190358

问题 3 : 根据附件 3 中的数据,分析产品的产量、合格率与生产线、操作人员等因素的关系。

问题 4: 根据实际情况,现需要扩大生产规模,将生产线每天的运行时间从 8 小时增加到 24 小时不间断生产。针对问题 3 的 10 条生产线,结合问题 3 的分析结果,考虑生产线与操作人员的搭配,制定最佳的操作人员排班方案,将结果存放到 result4-1.xlsx 和result4-2.xlsx 中(格式见表 2 和表 3,模板文件在附件 4 中),并在论文中给出最佳的排班方案及相关结果。

要求排班满足如下条件:

(1) 各操作人员做五休二,尽量连休 2 天;

(2) 各操作人员每班连续工作 8 小时;

(3) 班次时间:早班(8:00-16:00)、中班(16:00-24:00)、晚班(0:00-8:00);

(4) 各工龄操作人员的人数比例与问题 3 中的比例相同;各操作人员的班次安排尽量均衡。

2 问题分析

2.1 问题一

(1)分析故障数据特征,包括故障发生的时间分布、故障发生的频率、故障类型的分布等。

(2)构建故障报警模型,是多标签的分类问题,或者是针对每个故障编码建模,就是一个分类问题。分类算法包括决策树、随机森林、支持向量机、逻辑回归和神经网络等。也可以建立成一个时间序列问题,注意数据集给的日期和时间,格式不是标准的datetime格式,是1、2、3、4这样的格式。需要转换为datetime再去建模。

2.2 问题二

(1)故障识别

  • 如果建立成一个分类问题,针对每个生产线、每个故障编码的序列,分别训练一个分类模型。
  • 如果建立时间序列回归问题,可以采用ARIMA、LSTM等构建模型进行故障预测。

题目要求以附件一的数据作为训练集,预测附件2,然后生成result2.xlsx文件。但是目前还没有提供附件二的数据,就可以以附件一为训练集和测试集。跑通baseline模型。

(2)故障时长计算

  • 单次故障,不连续,持续时间为1
  • 连续两次故障,持续时间为2
  • 连续多次故障,持续时间为,开始时刻和结束时刻之间的时间差加1。

(3)每条生产线中各装置的每月统计数据

注意需要计算每个生产线的每个月统计数据,则需要使用分组操作来分析每条生产线中各装置的每月统计数据(故障次数、最长持续时长和最短持续时长)。

(4)输出结果

将每种类型的故障分析结果,横向排列,纵向是按故障发生的顺序排列,整理为dataframe格式,输出到result2.xlsx中。

2.3 问题三

(1) 产量分析

使用时间序列分析方法(如ARIMA模型)来预测产量随时间的变化趋势。

回归分析来探索产量与其他因素(如生产线编号、推送状态、装置故障等)的关系。

(2)合格率分析

逻辑回归分析来探索合格率与其他因素之间的关系;

使用决策树或随机森林等分类算法,寻找影响合格率的关键因素

(3) 故障分析

关联规则挖掘算法查找故障与其他因素(如操作人员、生产线编号)之间的关联性。

2.4 问题四

(1)在问题三的基础上,计算出每个生产线的生产效率和合格率,找出与操作人员、班次等因素的关系;

(2)根据生产效率和合格率的关系,制定最佳的操作人员排班方案;制定最佳的操作人员排班方案涉及到多个因素,包括但不限于:工作时间要求、人员能力匹配、轮班规则、休息时间安排、法定假期等。

(3)根据实际数据进行生产效率和合格率的计算,然后根据操作人员的工作时间和班次对其进行排班。这可能涉及到安排不同技能水平的操作人员,以确保生产线能够在高效率和高合格率下运行。实时调整排班计划,随着生产线的运行,实时监控生产效率和合格率的变化,及时调整操作人员的排班计划以适应变化的生产需求。结合其他因素进行综合考虑,如在排班计划中、操作人员的休息时间、加班安排、交接班等,以确保生产线的持续稳定运行。

3 Python代码实现

3.1 问题一


import pandas as pd
import matplotlib.pyplot as plt
import warnings
import seaborn as sns
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif'] = 'SimSun' # 换成自己环境下的中文字体,比如'SimHei'df = pd.read_csv('A题-示例数据/附件1/M101.csv')# 查看数据前几行
print(df.head())# 故障数据分析
fault_columns = [col for col in df.columns if '故障' in col]
fault_counts = df[fault_columns].sum()
print(fault_counts)# 可视化故障数据
plt.figure(figsize=(10, 6))
colors = sns.color_palette("hls", len(fault_counts))fault_counts.plot(kind='bar', color=colors)
plt.title('Device Fault Counts')
plt.xlabel('Device')
plt.ylabel('Fault Count')
plt.savefig('img/1.png',dpi=100)
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# 生产线编号分析
line_counts = df['生产线编号'].value_counts()
print(line_counts)# 可视化生产线编号分布
plt.figure(figsize=(10, 6))
colors = sns.color_palette("hls", len(line_counts))
line_counts.plot(kind='bar',color = colors)
plt.title('Production Line Distribution')
plt.xlabel('Production Line Number')
plt.ylabel('Count')
plt.tight_layout()
plt.savefig('img/2.png',dpi=100)
plt.show()

在这里插入图片描述

import matplotlib.pyplot as plt
import warnings
import seaborn as sns
warnings.filterwarnings('ignore')df = pd.read_csv('A题-示例数据/附件1/M101.csv')
# 物料推送气缸状态分析
push_counts = df['物料推送气缸推送状态'].value_counts()
pull_counts = df['物料推送气缸收回状态'].value_counts()
push_pull_counts = pd.DataFrame({'Push': push_counts, 'Pull': pull_counts})
print(push_pull_counts)plt.figure(figsize=(10, 6))
# 可视化物料推送气缸状态
colors = sns.color_palette("hls", len(push_pull_counts))push_pull_counts.plot(kind='bar', stacked=True,color = colors)
plt.title('Material Push Cylinder State')
plt.xlabel('State')
plt.ylabel('Count')
plt.tight_layout()
plt.savefig('img/3.png',dpi=100)plt.show()

在这里插入图片描述


import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, classification_report# 统计各装置故障的情况
fault_columns = ['物料推送装置故障1001', '物料检测装置故障2001', '填装装置检测故障4001', '填装装置定位故障4002','填装装置填装故障4003', '加盖装置定位故障5001', '加盖装置加盖故障5002','拧盖装置定位故障6001', '拧盖装置拧盖故障6002']
# 加载数据
data = pd.read_csv('A题-示例数据/附件1/M101.csv')
#  构建故障报警模型
# 首先,选取特征和目标变量
feature_columns = ['时间', '物料推送气缸推送状态', '物料推送气缸收回状态', '物料推送数', '物料待抓取数','填装数', '加盖数', '拧盖数', '合格数', '不合格数']
target_columns = fault_columnsdata_len = 10000
X = data[feature_columns][0:data_len]
# 多标签问题
y = data[target_columns][0:data_len]# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 使用随机森林模型进行训练
model = RandomForestClassifier()
model.fit(X_train, y_train)# 在测试集上进行预测
y_pred = model.predict(X_test)# 评估模型性能
print('混淆矩阵:')
print(confusion_matrix(y_test.values.flatten(), y_pred.flatten()))
print('\n分类报告:')
print(classification_report(y_test.values.flatten(), y_pred.flatten()))

在这里插入图片描述

3.2 问题二


import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from datetime import datetime
from collections import defaultdict# 读取数据
data = pd.read_csv('A题-示例数据/附件1/M101.csv')# 定义故障字段
fault_columns = ['物料推送装置故障1001', '物料检测装置故障2001', '填装装置检测故障4001', '填装装置定位故障4002', '填装装置填装故障4003', '加盖装置定位故障5001', '加盖装置加盖故障5002', '拧盖装置定位故障6001', '拧盖装置拧盖故障6002']
data.replace({1001: 1, 2001: 1, 4001: 1, 4002: 1, 4003: 1, 5001: 1, 5002: 1, 6001: 1, 6002: 1}, inplace=True)
# 故障报警日期、开始时间与持续时长
fault_info = defaultdict(list)
# line_number = data.groupby(['生产线编号'])
for line_number,line_data in data.groupby(['生产线编号']):for label in fault_columns:# 训练数据集长度data_length = 10000 #只取部分数据,用于跑通baseline,应该为len(line_data)# 构建故障预警模型X = line_data[line_data.columns.difference(['日期', '时间','生产线编号'])][0:data_length]y = line_data[label][0:data_length]# 80%用于训练,20%用于测试# train_len = int(0.8*len(X))# X_train, X_test, y_train, y_test = X[0:train_len],X[train_len:],y[0:train_len],y[train_len:]# 假设100%用于训练,100%用于测试X_train, X_test, y_train, y_test = X,X,y,yprint(f'生产线编号:{line_number},故障编码:{label},训练集样本数:{len(X_train)},测试集样本数:{len(X_test)}')。。。略,请下载完整资料acc = accuracy_score(y_test, y_pred)print("模型准确率:", acc)# 预测故障报警,假设全部数据集为附件2数据file2_df = line_data[line_data.columns.difference(['日期', '时间','生产线编号'])]predictions = rf.predict(file2_df)# 用生产线编号和故障编号,组成唯一的键,来唯一表示某个生产线上的特定故障数据key = (line_number,label)# 统计故障发生的日期、开始时间、持续时长for i in range(len(predictions) - 1):if predictions[i] == 1 and predictions[i+1] == 0:# 只发生一次,持续时长为1...略fault_info[key].append((happend_date,happend_time,happend_duration))if predictions[i] == 1 and predictions[i+1] == 1:if len(fault_info[key])==0:# 连续两次发生,持续时长为2...略fault_info[key].append((happend_date,happend_time,happend_duration))else:  # 连续多次发生,持续时长为,当前时间-上一次发生时间...略fault_info[key][-1] = ((happend_date,happend_time,happend_duration))
fault_info

在这里插入图片描述

# 将每条生产线,故障发生的日期、开始时间、持续时长数据,转为result2.xlsx格式
fault_info_new = defaultdict(list)
for key in fault_info.keys():if len(fault_info_new[key[1]])==0:fault_info_new[key[1]] = fault_info[key]else:fault_info_new[key[1]] += fault_info[key]
print(fault_info_new)

在这里插入图片描述

result_df_list = []
for df_cols in fault_info_new.keys():print(df_cols)# 将特定故障编号的数据,保存为单个表格temp_error_df = pd.DataFrame(fault_info_new[df_cols],columns=['日期', '开始时间', '持续时长/秒'])result_df_list.append(temp_error_df)
# 横向合并所有故障编号的数据result2_df = pd.concat(result_df_list,axis=1)result2_df.loc[-1] = [x for x in fault_info_new.keys() for _ in range(3)] # 添加故障编码到首行
result2_df.index = result2_df.index + 1  # 将索引整体后移
result2_df = result2_df.sort_index()  # 重新按索引排序result2_df.to_excel('./提交数据/result2.xlsx',index=False)
print(result2_df)

在这里插入图片描述

# 统计每条生产线的数据,故障发生的日期、开始时间、持续时长数据
fault_info_new = defaultdict(list)
for key in fault_info.keys():if len(fault_info_new[key[0]])==0:fault_info_new[key[0]] = fault_info[key]else:fault_info_new[key[0]] += fault_info[key]
print(fault_info_new)

在这里插入图片描述

for line_n in fault_info_new.keys():line_fault_info = fault_info_new[line_n]third_elements = [x[2] for x in line_fault_info]monthly_fault = sum(third_elements)max_duration = max(third_elements)min_duration = min(third_elements)print(f"生产线:{line_n},每月故障总次数:{monthly_fault},最长时间:{max_duration},最短时间:{min_duration}")

在这里插入图片描述

3.3 问题三、四

请下载完整资料

4 完整资料

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/737643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode - 寻找数组的中心

先学习一下前缀和吧 LCR 012.寻找数组的中心LCR 012. 代码解析 在读题读到左侧元素之和等于右侧所有元素之和的时候,我觉得可以用前缀和,然后结合下面的示例,模拟了一下发现确实可以。 我的想法是搞两个数组,一个来存从左到右数…

微信小程序(五十六)逆地址解析示范

注释很详细,直接上代码 温馨提醒:记得给自己的key配额,基础操作与前提配置参考本专栏第五十四篇 新增内容: 1.逆地址解析基础示范 2.开放经纬度参数 3.只列举修改的js部分,前提配置请看 温馨提醒 源码: ind…

软件开发人员从0到1实现物联网项目:需求分析

文章目录 前言市场调研线下考察竞品参考 项目目标功能需求用户端功能需求商家功能需求系统管理功能需求 非功能需求性能安全性易用性扩展性可靠性 小结 前言 上文对实现自助棋牌室项目涉及到的技术做了调研,尤其是物联网技术。那接下来就是对需求进行一番分析了&am…

力扣 239. 滑动窗口最大值

题目链接 chatgpt写的代码, 首先这是个滑动窗口的问题,要用单调队列来解决,这个就是毋庸置疑的,就直接接受就行了 其次,不知道单调队列是啥,知道单调队列是啥了,又不知道单调队列该如何实现&…

王道机试C++第 5 章 数据结构二:队列queue和21年蓝桥杯省赛选择题Day32

目录 5.2 队列 1.STL-queue 课上演示: 基本代码展示: 2. 队列的应用 例:约瑟夫问题 No. 2 题目描述: 思路提示: 代码展示: 例:猫狗收容所 题目描述: 代码表示&#xff1…

蓝桥杯-List集合

目录 List集合实例化 List集合实例化步骤 常用方法 ArrayList方法 1:add(Object element) 2:size() 3:get(int index) 4:isEmpty() 5:contains(Object o) 6:remove(int index) 总结ArrayList list集合的特点…

Web服务器需要警惕的一些安全隐患

Web服务器需要警惕的一些安全隐患有哪些,今天德迅云安全就带您来了解下。熟悉了解了就知道怎么规避风险。不过无论是什么漏洞,都体现着安全是一个整体的真理,考虑Web服务器的安全性,必须要考虑到与之相配合的操作系统。 1.物理路径…

应用方案 | DCDC电源管理芯片MC34063A

DCDC电源管理芯片 MC34063A MC34063A 为一单片 DC-DC 变换集成电路,内含温度补偿的参考电压源(1.25V)、比较器、能有效限制电流及控制工作周期的振荡器,驱动器及大电流输出开关管等。外配少量元件,就能组成升压、…

Redis缓存、缓存穿透、缓存雪崩、缓存击穿

1.认识Redis缓存 先来认识一下缓存,再了解redis用作缓存时的作用和问题,以及如何解决redis缓存在的问题。 1.1.什么是缓存 1.2.缓存的优缺点(作用和成本) 2.redis缓存的作用 正常客户端请求服务器,服务器会直接访问数据库,这有…

Selenium自动化测试细节讲解

与以前瀑布式开发模式不同,现在软件测试人员具有使用自动化工具执行测试用例套件的优势,而以前,测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试,而是最大程度地减少手动运行的测试。自动化…

R语言系列2——R语言数据处理技巧

目录 写在开头1. 数据导入与导出1.1 基础操作详解1.1.1 导入数据1.1.2 导出数据 1.2 高级技巧详解1.2.1 自定义导入1.2.2 自定义导出 1.3 常见问题 2. 数据清洗基础2.1 缺失值处理2.1.1 删除含缺失值的行或列2.1.2 填充缺失值2.1.3 预测模型填充2.1.4 使用特定值填充 2.2 数据类…

【智能家居】东胜物联ODM定制ZigBee网关,助力能源管理解决方案商,提升市场占有率

背景 本文案例服务的客户是专业从事智能家居能源管理的解决方案商,其产品与服务旨在帮助用户监测、管理和优化能源消耗,以提高能源使用效率。 随着公司的扩张,为了增加市场占有率,他们希望找到更好的硬件服务支持,以…

mysql笔记:7. 索引

文章目录 索引含义和特点索引分类普通索引和唯一索引单列索引和组合索引全文索引空间索引 索引设计原则创建索引直接创建索引在已经存在的表上创建索引 删除索引 在关系数据库中,索引是一种可以加快数据检索速度的数据结构,主要用于提高数据库查询数据的…

人工智能指出数学教育问题

国内的数学教育长期以来都以其注重的计算能力而著称。从小学开始,学生们就接受严格的算术训练,九九乘法口诀表几乎成为了每个人的必修课。然而,尽管中国在数学方面的成绩屡获佳绩,但是锻炼的都是很容易被计算器或者计算机取代的能…

零基础学习JS--基础篇--使用类

JavaScript 是一个基于原型的语言——一个对象的行为取决于它自身的属性及其原型的属性。 在 JavaScript 中,类可以看作是已有的原型继承机制的一种抽象——所有语法都可以转换为原型继承。类本身也是不过是 JavaScript 里一种普通的值,它们有其自己的原…

JavaScript 技术100问?

JavaScript 是一种高级的、解释型的编程语言,通常用于为网页添加交互性和动态功能。作为 Web 开发中最重要的技术之一,JavaScript 在前端开发中扮演着重要角色。它可以直接嵌入到 HTML 中,并通过浏览器解释执行。JavaScript 的语法类似于 Jav…

2.Linux文件IO基础

Linux 文件 I/O(Input/Output)基础是 Linux 应用程序开发中的重要组成部分。在 Linux 系统中,文件 I/O 涉及到文件的读取和写入,以及文件描述符、系统调用等概念。以下是 Linux 文件 I/O 的基础知识: 1. 文件描述符 …

GEE Rgee——使用 eemont 和 geemap来进行Landsat 8数据的反演NDSI

简介 用 rgee 在 R 中使用 eemont 和 geemap来快速进行NDSI反演。 Landsat 8是一颗运行于太阳同步轨道上的遥感卫星,可以获取高分辨率的光学遥感数据,其中包括多光谱和热红外波段。NDSI(Normalized Difference Snow Index)是一种用于检测和分析雪被覆盖情况的指数。本文将…

算法刷题day25:多路归并

目录 引言概念一、鱼塘钓鱼二、技能升级三、序列 引言 关于这个多路并归蓝桥杯考的不是很多,如果要出的话,可能模型都会差不多,因为不会出太难的题,难题基本上都是贪心、DP之类的,所以好好刷题刷熟练就行了&#xff0…

ms office学习记录10:Excel㈣

自动填充时也可输入前几个值,选中单元格双击右下角黑色箭头进行填充 将填充样本行列粘贴至原列后要注意删除样本行列内容 排序与筛选 “数据”选项卡中的“排序”与“开始”选项卡中的“排序和筛选”实质相同 排序依据:数值内容和数值格式 “选项”…