2019年第九届MathorCup高校数学建模挑战赛
D题 钢水“脱氧合金化"配料方案的优化
原题再现:
整体求解过程概述(摘要)
我国积极推动钢铁工业转型升级,对脱氧合金化工艺环节的配料方案进行优化是技术升级的重要部分。本文结合灰色关联分析模型(GRA)和 SPSS 相关系数分析结果得到了影响 C,Mn 收得率的主要因素。利用支持向量回归模型(SVR)与贝叶斯岭回归模型对 C,Mn 元素收得率进行预测,最后利用改进粒子群模型优化了合金配料方案。
针对问题一,本文先对附件 1 的数据进行了预处理,得到了较完整的实验数据,从而计算了 C、Mn 元素的历史平均收得率,分别为 91.09%、88.39%。其次,通过运用灰色关联模型和 SPSS 相关性系数分析得到两种主要因素的分析结果。综合考虑,分析出对 C 收得率的主要影响因素为转炉终点温度、钢水净重、锰硅合金 FeMn68Si18、石油焦增碳剂、碳化硅(55%)、硅钙碳脱氧剂;对 Mn 收得率的主要影响因素为终点温度、钢水净重、硅锰面、锰硅合金 FeMn68Si18,锰硅合金 FeMn64Si27。
针对问题二,本文选取 80%的数据作为训练集,20%作为测试集。先利用支持向量回归(SVR)模型进行收得率预测,结果得到 SVR 模型的 C、Mn 预测准确率分别为:54%、53%。提出了两种优化方案:从数据集层面,我们调整输入数据集,使预测准确率分别提高至 55%、57%;从模型层面,采用贝叶斯岭回归模型进行预测。对比发现贝叶斯岭回归预测模型效果优于 SVR 预测模型,贝叶斯岭回归模型的预测成功率为:57%、56%。
针对问题三,本文将问题二中预测合金收得率的结果作为已知数据。为了计算最低成本的合金料配比,先假设了目标函数并添加约束条件,利用改进粒子群优化算法(PSO)进行求解。在合金收得率最优条件下,此时得到碳,锰元素最优化合金配料总成本分别为 11186.83,9764.95 元。
针对问题四,我们通过建立的模型计算出的结果与实际情况,向炼钢厂领导提出了具有一定参考价值的建议,希望能对实际生产有一些积极影响。
模型假设:
● 假设钢水质量在脱氧合金化前后不会发生变化
● 假设脱氧合金化过程不受工人的技术水平影响
● 假设所使用的转炉规格与质量一致
● 暂不研究时间因素对结果的影响
● 暂不研究脱氧方法的不同的影响
● 暂不研究加入合金顺序的影响
问题分析:
问题一分析:解决问题一最先要做的是处理附件一数据的残缺问题,我们选择通过回归方法补齐大量空白数据。具体来说主要通过多元线性回归,以已知的连铸正样碳当量(Ceq)为因变量,通过查询文献,找出其相关的自变量,使用 SPSS 对已知数据集进行多元线性回归,得到相关的数学模型后计算未知数据;其他部分的较多空白数据,我们以简单线性回归即可拟合,剩余个别缺失我们采用均值补齐;同时,对于少量的不符合生产要求、数值波动过大的异常数据,直接剔除。经过数据的预处理后,我们得到一个较为完整的数据表,通过题目中已经给出的合金收得率的公式,就能够直接套用计算得出历史收得率。第二小问,我们选择灰色关联分析和相关性系数两种方法分别提取对收得率贡献比较大的元素:使用 Python 对数据选取合适的关联系数进行灰色关联的计算,同时使用 SPSS 对数据进行 Pearson 和 Kendall 相关系数的检验,通过对比两个方案的结果,选择综合结果贡献最大的数据集作为影响收得率的主要因素。
问题二分析:根据问题一的结果,通过查阅转炉炼钢与脱氧合金化的相关文献,从回归预测模型的角度,自主选择 80%的数据为训练集,选择构建支持向量回归(SVR)模型预测所求元素收得率,并以剩余的 20%数据作为测试集,检验模型的可行性。在优化模型方面,从数据和模型两个方面进行改进:在数据上,增加影响因素、对在数据预处理中补齐的数据进行重新排列组合,再次运行得到新的收得率,并通过与先前结果的对比,比较优化情况;在模型上,选择贝叶斯岭回归模型进行重新描述,比较测试集的准确度、误差等参数,讨论模型优化的方向和成功率。
问题三分析:将问题二预测出的收得率作为已知数据,结合附录二中的价格,建立粒子群(PSO)模型来进行优化计算,其中,将总成本作为目标函数,以元素质量、元素总量、钢号的内控区间作为约束条件,结合模型求解构成目标函数最小值合金配比结果,并给出最优合金配料方案。在运行中通过计算机自主优化参数,控制迭代次数,得到全局最优解。
问题四分析:根据前文研究的结果,结合炼钢厂实际情况,写一封具有实际指导价值的建议信给炼钢厂领导。
模型的建立与求解整体论文缩略图
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
程序代码:(代码和文档not free)
C 与 Mn 收得率计算程序
1. import pandas as pd
2. import csv
3. data = pd.read_csv('dataOne.csv', encoding='GBK')
4. Data = data.values
5. Cm = []
6. Cz = []
7. Mnm = []
8. Mnz = []
9. #计算钢水中合金元素质量
10. for i in range(len(Data)):
11. a = float(Data[i][7])*(Data[i][8]-float(Data[i][2]))
12. b = float(Data[i][7]) * (Data[i][9] - float(Data[i][3]))
13. Cz.append(a)
14. if(i<len(Data)):
15. Mnz.append(b)
16. #计算加入的合金元素总质量
17. for i in range(len(Data)):
18. Cm.append(Data[i][16]*0.031 + Data[i][17]*0.031 + Data[i][19]*0.00374 +Data[i][21]*0.017
19. + Data[i][22]*0.00006 + Data[i][23]*0.00006 + Data[i][24]*0.96 +
Data[i][25]*0.017
20. + Data[i][26]*0.017 + Data[i][27]*0.3 + Data[i][28]*0.225692308)
21. if(i<=len(Data)):
22. Mnm.append(Data[i][21]*0.3 + Data[i][22]*0.664 + Data[i][25]*0.664+Data[i][26]*0.664)
23. C_rate = []
24. Mn_rate = []
25. num = len(Data)
26. for i in range(num-9):
27. if(Mnm[i] == 0):
28. del Mnm[i]
29. del Mnz[i]
30. 31. #计算 C,Mn 元素的每次的可得率
32. for i in range(len(Cz)):
33. C_rate.append(Cz[i]/Cm[i])
34. if (i < len(Mnz)):
35. Mn_rate.append(Mnz[i]/Mnm[i])
36. num = len(C_rate)
37. #去除异常数据
38. for i in range(1600):
39. if (C_rate[i] >= 1 or C_rate[i] <= 0):
40. C_rate[i] = 0.0
41. num -= 1
42. 43. 44. #计算 C 元素的均收得率
45. sum2 = 0.0
46. for k in range(1600):
47. sum2 += C_rate[k]
48. C_yield = sum2/num
49. print('碳元素的收得率:', C_yield)
50. 51. #计算 Mn 元素的平均收得率
52. num = len(Mn_rate)
53. for j in range(1600):
54. if(Mn_rate[j] >= 1 or Mn_rate[j] <= 0):
55. Mn_rate[j] = 0.0
56. num -= 1
57. sum1 = 0.0
58. 59. for k in range(1600):
60. sum1 += Mn_rate[k]
61. Mn_yield = sum1/num
62. print('锰元素的收得率:',
灰色关联分析程序
1. import pandas as pan
2. 3. #数据预处理 初始化
4. x=pan.read_csv('mn.csv')
5. x=x.iloc[:,:].T
6. c=0.5
7. 8. # 均值化处理
9. x_mean=x.mean(axis=1)
10. for i in range(x.index.size):
11. x.iloc[i,:] = x.iloc[i,:]/x_mean[i]
12. 13. # 提取子队列和母队列
14. pa=x.iloc[0,:]
15. ps=x.iloc[1:,:]
16. 17. # 比较队列与参考队列相减
18. t=pan.DataFrame()
19. 20. for j in range(ps.index.size):
21. temp=pan.Series(ps.iloc[j,:]-pa)
22. t=t.append(temp,ignore_index=True)
23. 24. #求最大差和最小差
25. maxx=t.abs().max().max()
26. minn=t.abs().min().min()
27. ksi=((minn+c*maxx)/(abs(t)+c*maxx))
28. 29. #关联度
30. r=ksi.sum(axis=1)/ksi.columns.size
31. 32. #关联度排序
33. result=r.sort_values(ascending=False)
34. print(result)